反射常用API以及内省机制(代码)

学习内容:

(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以及内省机制的代码了,基础去看我的上一篇博客:

上一篇:dotnet core 2 使用 DispatchProxy 做动态代理 AOP 入门


下一篇:对于反射中的invoke()方法的理解