package d.cn.itcast.reflect; |
import java.lang.reflect.Constructor; |
import java.lang.reflect.Field; |
import java.lang.reflect.Method; |
import org.junit.Test; |
//在创建一个类User.java 属性 id ,name 提供get set 方法 和构造 |
public class ReflectUser { |
// @Test |
public void test1() throws Exception { |
// 1: 找User.class 包的全路径 d.cn.itcast.reflect.User.class |
// 获取Class 对象 User字节码对象 |
Class clazz = Class.forName( "d.cn.itcast.reflect.User" ); |
// 2: 获取对象实例化 通过构造方法 实例化对象 |
Constructor c1 = clazz.getConstructor(String. class , String. class ); |
// 可以通过构造方法 进行对象属性的注入 |
User user = (User) c1.newInstance( "1010" , "lisi" ); |
// 3: 对实例化的对象 调用 指定的方法getName获取名字 |
Method m = clazz.getMethod( "getName" , null ); |
// 表示方法名是getName 该方法参数是null 无参方法的反射调用 |
// 有参方法的调用 需要申明 方法参数的数据类型 String.class |
Method m1 = clazz.getMethod( "setName" , String. class ); |
m1.invoke(user, "zs" ); // 给该方法 传递参数具体值 |
// 4: 调用方法执行 invoke(实例化对象,方法需要的参数) |
// 方法执行 |
System.out.println(m.invoke(user, null )); |
// 2.2 操作属性对象 Field |
// Field[] fields = clazz.getFields();// 获取不到.默认 私有的属性....只能获取public 修饰 |
// Field[] fields = clazz.getDeclaredFields();// 获取所有的属性 public private |
// 默认的都可以获取 |
// 默认 |
// for (int i = 0; i < fields.length; i++) { |
// System.out.println(fields[i].getName()); |
// } |
Field field = clazz.getDeclaredField( "name" ); |
field.setAccessible( true ); // 注意: 私有的属性 注入需要添加此行代码 |
field.set(user, "赵六" ); // object 实例化 user value 属性值 |
System.out.println(m.invoke(user, null )); |
// Method[] methods = clazz.getMethods(); |
// for (int i = 0; i < methods.length; i++) { |
// System.out.println(methods[i].getName()); |
// } |
} |
@Test |
public void test2() throws Exception { |
// 2: 获取字节码对象第二种方式 |
// Class c = User.class; |
// 3: 类getClass() 第三种方式 |
// User u = new User(); |
// u.getClass(); |
// 常用第一种 |
Class clazz = Class.forName( "d.cn.itcast.reflect.User" ); |
// 直接获取无参构造实例化 |
User user = (User) clazz.newInstance(); |
Constructor[] constructors = clazz.getConstructors(); |
Field field = clazz.getField( "name" ); |
field.set(user, "lisi" ); |
// Method m = clazz.getMethod("getName", null); |
// String name = (String) m.invoke(user, null); |
// System.out.println(name); |
} |
} |