学习内容:
(1)获取构造函数
这里不贴Person类了,不然代码太多太乱了,只给出一些常用API
// 创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 1、获取公共无参的构造方法
Constructor<?> constructor = aClass.getConstructor();
// 2、获取公共有参的构造方法
Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class)
// 3、获取私有的无参构造方法
Constructor<?> priConstructor = bClass.getDeclaredConstructor();
// 4、获取私有的有参构造方法
Constructor<?> priConstructor1 = bClass.getDeclaredConstructor(String.class, int.class);
// 5、通过公共无参构造创建对象
Object o = constructor.newInstance();
// 6、通过私有构造器创建实例对象,私有构造器调用必须让Java检测机制忽略访问权限(暴力反射)
priConstructor1.setAccessible(true);
Object obj = priConstructor1.newInstance("熊大", 15);
(2)获取方法
Person中的add、del、set、query都是我自定义的方法,具体类型看注释
// 创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 1、通过字节码对象获取公共无参方法
Method add = aClass.getMethod("add");
// 2、通过字节码对象获取私有无参方法
Method del = aClass.getDeclaredMethod("del");
// 3、通过字节码对象获取公共有参方法
Method set = aClass.getMethod("set", String.class);
// 4、通过字节码对象获取私有有参方法
Method query = aClass.getDeclaredMethod("query", String.class, int.class);
// 5、调用公共有参方法,o是字节码对象调用构造方法创建出来的对象
Object obj = set.invoke(o, "小肥羊");
// 6、调用私有方法,o是字节码对象调用构造方法创建出来的对象,私有方法调用必须让Java检测机制忽略访问权限(暴力反射)
query.setAccessible(true);
Object obj2 = query.invoke(o, "大肥羊", 11);
(3)内省机制获取JavaBean字段
public void testSetIntrospect() throws ClassNotFoundException, IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
// 1、创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 2、获取构造器并通过构造器创建实例
Object o = aClass.newInstance();
// 3、通过 Introspector 类把bean信息封装到 beanInfo 中
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
// 4、通过 getPropertyDescriptors() 获取一个属性数组
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
// 5、遍历属性数组,并通过比较属性获取该属性的Set方法,然后利用该Set方法给对象设置值
for(PropertyDescriptor pd : propertyDescriptors) {
// 获取属性名
String name = pd.getName();
System.out.println("name = " + name);
// 获取Get方法
Method getMethod = pd.getReadMethod();
// 获取Set方法
Method setMethod = pd.getWriteMethod();
// 当方法名为 name 时进入(Get、Set都能进入)
if(name.equals("name")) {
// 执行 name 的 Set 方法
setMethod.invoke(o, "小肥羊");
System.out.println("o = " + o);
}
// 执行Get方法
Object invoke = getMethod.invoke(o);
System.out.println("invoke = " + invoke);
}
}
(4)内省机制获取JavaBean字段
总结:
以上就是反射常用的API以及内省机制的代码了,基础去看我的上一篇博客: