首页 > 代码库 > Java Reflection 概述

Java Reflection 概述

Reflection 被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类内部信息,并能直接操作任意对象的内部属性及方法
反射类:java.lang.Class 是反射的源头,下面以 Java 程序运行过程来说明清楚:
        我们写代码新建的一个类,通过编译(javac.exe)生成了字节码文件(.class),再用 java.exe 加载该字节码文件到内存(使用的是 JVM 的类装载器)之后,内存缓存中的这一块区域就是这个运行时类所对应的 Class 类的实例,因为这个过程对于每个类的加载来说只有一次,故每个运行时类对应的 Class 类对象都是唯一的。
Java 反射机制提供的功能:
  • 运行时判断任意一个对象所属的
  • 运行时构造任意一个类的对象
  • 运行时判断任意一个类所具有的成员变量和方法
  • 运行时调用任意一个对象的成员变量和方法
  • 生成动态代理

简单示例:
  1. public class TestReflection {
  2. public static void main(String[] args) throws Exception {
  3. // 通过"类名.class"创建 Class 类(运行时类)的对象
  4. Class<Person> clazz = Person.class;
  5. // 1.创建 clazz 对应的运行时类 Person 的对象并赋给 Person 类对象的引用 p
  6. Person p = clazz.newInstance();
  7. // 2.通过反射,调用运行时类的属性
  8. Field f1 = clazz.getField("age");// 调 public 修饰的属性并赋给 Field 类对象的引用 f1
  9. f1.set(p, 16);
  10. Field f2 = clazz.getDeclaredField("name");// 调非 public 修饰的属性并赋给 Field
  11. // 类对象的引用 f2
  12. f2.setAccessible(true);
  13. f2.set(p, "chen");
  14. System.out.println(p);// Person [age=16, name=chen]
  15. // 3.通过反射,调用运行时类的
  16. Method m1 = clazz.getMethod("custom");
  17. m1.invoke(p);// custom method
  18. Method m2 = clazz.getMethod("custom", String.class);
  19. m2.invoke(p, "arg");// custom method arg
  20. // 说明唯一性
  21. System.out.println(clazz == new Person().getClass());// true
  22. }
  23. }
  24. class Person {
  25. public int age;
  26. private String name;
  27. public Person() {
  28. super();
  29. }
  30. public Person(int age, String name) {
  31. super();
  32. this.age = age;
  33. this.name = name;
  34. }
  35. public int getAge() {
  36. return age;
  37. }
  38. public void setAge(int age) {
  39. this.age = age;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Person [age=" + age + ", name=" + name + "]";
  50. }
  51. public void custom() {
  52. System.out.println("custom method");
  53. }
  54. public void custom(String s) {
  55. System.out.println("custom method " + s);
  56. }
  57. }

Java Reflection 概述