[java]代码库
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);
}
}