概念

通过反射机制,可以在运行时获得程序或者程序集中每个类型的成员和成员信息。

反射应用

通过反射获取Class对象

  1. //1、 通过完整路径名获取Class对象
  2. Class clazz = Class.forName("com.test.reflection.Student");
  3. //2、 通过类的class属性(需要导入类的包)
  4. Class clazz = Student.class;
  5. //3、 通过对象的getClass()函数
  6. Student student = new Student();
  7. Class clazz = student.getClass();

获取成员变量

  1. (1) getDeclaredFields // 获取所有声明字段,包括共有字段和私有字段
  2. clazz.getDeclaredFields();
  3. (2) getFields // 仅获取公有字段
  4. clazz.getFields();

获取构造函数

  1. (1) getDeclaredConstructors // 获取所有构造方法
  2. clazz.getDeclaredConstructors();
  3. (2) getConstructors // 仅获取共有构造方法
  4. clazz.getConstructors();

获取非构造方法

  1. (1) getDeclaredMethods; // 获取所有声明的非构造函数
  2. clazz.getDeclaredMethods();
  3. (2) getMethods; // 仅获取公有的非构造函数,(可以同时获得到父类的方法)
  4. clazz.getMethods();
  5. Method[] methods = clz.getMethods();
  6. for(Method method : methods){
  7. System.out.println(method.getName());
  8. }
  9. 打印结果:
  10. setUsername
  11. setAge
  12. getUsername
  13. getAge
  14. wait
  15. wait
  16. wait
  17. equals
  18. toString
  19. hashCode
  20. getClass
  21. notify
  22. notifyAll

创建对象的方法

  1. (1) 通过Class对象的newInstance()方法
  2. Class clazz = User.class;
  3. User use = (User) clazz.newInstance();
  4. (2) 通过Constructor对象的newInstance()方法
  5. Class clazz = Class.forName("com.test.reflection.user");
  6. Constructor constructor = clazz.getConstructor();
  7. User user = (User) constructor.newInstance();
  8. 同时,该方法可以选择特定构造方法,而Class对象则智能使用默认的无参构造方法
  9. Class clazz = User.class;
  10. Constructor constructor = clazz.getConstructor(String.class);
  11. User user = (User) constructor.newInstance("hyx");

利用反射创建数组

  1. @Test
  2. public void createArray() throws ClassNotFoundException {
  3. Class<?> clazz = Class.forName("java.lang.String");
  4. Object array = Array.newInstance(clazz, 2);
  5. Array.set(array, 0, "hyx");
  6. Array.set(array, 1, "whm");
  7. System.out.println(Array.get(array, 1));
  8. }