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

小咪咪 2022-11-17 14:53 288阅读 0赞

学习内容:

(1)获取构造函数
这里不贴Person类了,不然代码太多太乱了,只给出一些常用API

  1. // 创建字节码对象
  2. Class<?> aClass = Class.forName("com.yy.Person");
  3. // 1、获取公共无参的构造方法
  4. Constructor<?> constructor = aClass.getConstructor();
  5. // 2、获取公共有参的构造方法
  6. Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class)
  7. // 3、获取私有的无参构造方法
  8. Constructor<?> priConstructor = bClass.getDeclaredConstructor();
  9. // 4、获取私有的有参构造方法
  10. Constructor<?> priConstructor1 = bClass.getDeclaredConstructor(String.class, int.class);
  11. // 5、通过公共无参构造创建对象
  12. Object o = constructor.newInstance();
  13. // 6、通过私有构造器创建实例对象,私有构造器调用必须让Java检测机制忽略访问权限(暴力反射)
  14. priConstructor1.setAccessible(true);
  15. Object obj = priConstructor1.newInstance("熊大", 15);

(2)获取方法
Person中的add、del、set、query都是我自定义的方法,具体类型看注释

  1. // 创建字节码对象
  2. Class<?> aClass = Class.forName("com.yy.Person");
  3. // 1、通过字节码对象获取公共无参方法
  4. Method add = aClass.getMethod("add");
  5. // 2、通过字节码对象获取私有无参方法
  6. Method del = aClass.getDeclaredMethod("del");
  7. // 3、通过字节码对象获取公共有参方法
  8. Method set = aClass.getMethod("set", String.class);
  9. // 4、通过字节码对象获取私有有参方法
  10. Method query = aClass.getDeclaredMethod("query", String.class, int.class);
  11. // 5、调用公共有参方法,o是字节码对象调用构造方法创建出来的对象
  12. Object obj = set.invoke(o, "小肥羊");
  13. // 6、调用私有方法,o是字节码对象调用构造方法创建出来的对象,私有方法调用必须让Java检测机制忽略访问权限(暴力反射)
  14. query.setAccessible(true);
  15. Object obj2 = query.invoke(o, "大肥羊", 11);

(3)内省机制获取JavaBean字段

  1. public void testSetIntrospect() throws ClassNotFoundException, IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
  2. // 1、创建字节码对象
  3. Class<?> aClass = Class.forName("com.yy.Person");
  4. // 2、获取构造器并通过构造器创建实例
  5. Object o = aClass.newInstance();
  6. // 3、通过 Introspector 类把bean信息封装到 beanInfo 中
  7. BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
  8. // 4、通过 getPropertyDescriptors() 获取一个属性数组
  9. PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  10. // 5、遍历属性数组,并通过比较属性获取该属性的Set方法,然后利用该Set方法给对象设置值
  11. for(PropertyDescriptor pd : propertyDescriptors) {
  12. // 获取属性名
  13. String name = pd.getName();
  14. System.out.println("name = " + name);
  15. // 获取Get方法
  16. Method getMethod = pd.getReadMethod();
  17. // 获取Set方法
  18. Method setMethod = pd.getWriteMethod();
  19. // 当方法名为 name 时进入(Get、Set都能进入)
  20. if(name.equals("name")) {
  21. // 执行 name 的 Set 方法
  22. setMethod.invoke(o, "小肥羊");
  23. System.out.println("o = " + o);
  24. }
  25. // 执行Get方法
  26. Object invoke = getMethod.invoke(o);
  27. System.out.println("invoke = " + invoke);
  28. }
  29. }

总结:

以上就是反射常用的API以及内省机制的代码了,反射基础去看我的上一篇博客:博客地址

发表评论

表情:
评论列表 (有 0 条评论,288人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 内省机制

    一、内省机制概述         Java中的反射机制是通过名称得到类的方法和对象的成份,对于一切Java类都是适用的,但是有时候使用起来比较麻烦。而JavaBean...

    相关 Java反射内省

    反射 用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。 例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了

    相关 java 内省机制

    什么是内省: 官方: 内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。 个人理解: 说白了就是通过反

    相关 Java内省机制

    1).内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setN...