ToB企服应用市场:ToB评测及商务社交产业平台

标题: 反射相关API [打印本页]

作者: 饭宝    时间: 2024-9-20 18:56
标题: 反射相关API
反射的作用
在不修改源码的情况下,扩展功能。
步伐在运行的时期,通过反射机制,获取类的所有内部信息,并且利用类的对象。
Class类

[1] Class类 常用方法

通过类的全路径名 获取Class对象


获取类加载器


获取实例对象


获取构造器对象


获取成员属性对象


获取成员方法对象


[2] 获取Class类对象

获取Class类对象的4种方式


根本类型和包装类型的Class对象

其它类型的Class对象


Constructor类



创建实例对象
  1. //获取Class类对象
  2. Class<?> clazz = Class.forName(className);
  3. //获取空参构造器对象
  4. Constructor<?> constructor = clazz.getConstructor();
  5. Student stu= (Student)constructor.newInstance();
  6. //获取有参构造器对象
  7. Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
  8. Student stu= (Student)constructor.newInstance("www", 50);
复制代码
Field类

Method类


使用反射的步骤


应用实例

[1] 使用反射 - 创建对象
  1. //1.获取User类的Class对象
  2. Class<?> cls = Class.forName("com.java.test.Student");
  3. //2.无参构造器创建对象
  4. Object o = cls.newInstance();
  5. //3.有参构造器创建对象
  6. Constructor<?> constructor = cls.getConstructor(int.class, String.class);
  7. Object o2 = constructor.newInstance(1000, "hello");
  8. //4.私有有参构造器创建对象
  9. Constructor<?> declaredConstructor = cls.getDeclaredConstructor(String.class);
  10. declaredConstructor.setAccessible(true);
  11. Object o3 = declaredConstructor.newInstance("jack");
复制代码
[2] 使用反射 - 利用属性
  1. //获取Class对象
  2. Class<PrivateTest> cls = PrivateTest.class;
  3. //使用Class类对象,创建实例对象
  4. PrivateTest o = cls.newInstance();
  5. //获取指定的字段对象
  6. Field nameFieldObj = cls.getDeclaredField("name");
  7. nameFieldObj.setAccessible(true);
  8. nameFieldObj.set(o,"汪汪");
  9. //获取指定的方法对象
  10. Method getNameObj = cls.getMethod("getName");
  11. System.out.println(getNameObj.invoke(o));
复制代码
[3] 使用反射 - 调用方法

[4] 通过设置文件,创建对象并调用方法

设置文件
  1. classfullpath=com.reflectiontest.demo.domain.Cat
  2. method=hi
  3. name=zhangsan
  4. age=19
复制代码
main方法
  1. //1. 通过类加载器读取src目录下的配置文件
  2. // 获取类加载器
  3. ClassLoader clazzLoader = DemoTest02.class.getClassLoader();
  4. // 读取配置文件
  5. InputStream is = clazzLoader.getResourceAsStream("stu.ini");
  6. Properties pro = new Properties();
  7. pro.load(is);
  8. String classfullpath = pro.getProperty("classfullpath");
  9. String method = pro.getProperty("method");
  10. String name = pro.getProperty("name");
  11. int age = Integer.parseInt(pro.getProperty("age"));
  12. //2.使用反射技术
  13. //根据全类名获取Class对象
  14. Class<?> cls = Class.forName(classfullpath);
  15. //通过Class类 获取对象实例
  16. Object o = cls.newInstance();
  17. //获取空参构造器对象
  18. Constructor<?> constructor = clazz.getConstructor();
  19. Student stu= (Student)constructor.newInstance();
  20. //获取有参构造器对象
  21. Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
  22. Student stu= (Student)constructor.newInstance("www", 50);
  23. //操作属性   
  24. System.out.println("--通过Field对象获取私有属性的值--");
  25. Field nameObj = cls.getDeclaredField("name");
  26. nameObj.setAccessible(true);
  27. System.out.println(nameObj.get(o));//获取属性的值
  28. nameObj.set(o,"newName");//设置属性的值
  29.    
  30. //操作方法
  31. //获取Method对象
  32. Method methodObj1 = cls.getMethod(method);
  33. //通过Method对象调用方法
  34. methodObj1.invoke(o);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4