首页 > 代码库 > Java反射

Java反射

 

一、JAVA反射

1、在运行状态中,对于任意一个类,都能够知道这个类的属性和方法。

2、对于任意一个对象,都能够调用它的任何方法和属性。

这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

二、反射的作用

在JAVA中,只要给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态地创建对象和编译。

反射机制主要提供了以下功能: 

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

三、反射的原理

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现主要借助以下四个类:

Class:类的对象

Constructor:类的构造方法

Field:类中的属性对象

Method:类中的方法对象

1、获取类对象:

通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");

通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();

2、获取类中的构造方法:

技术分享

技术分享

3、获取类中的属性:

技术分享

技术分享

4、获取类中的方法:

技术分享

技术分享

四、代码演示

技术分享
 1 package reflection; 2  3 import java.io.Serializable; 4  5 public class DemoTest implements Serializable 6 { 7     /** 8      * 注释内容 9      */10     private static final long serialVersionUID = 1L;11 12     public String name;13     public int age;14     15     public DemoTest()16     {17     }18 19     public DemoTest(String name, int age)20     {21         this.name = name;22         this.age = age;23     }24     25     public void sayHello(String param)26     {27         System.out.println("hello " + param);28     }29 30     public String getName()31     {32         return name;33     }34 35     public void setName(String name)36     {37         this.name = name;38     }39 40     public int getAge()41     {42         return age;43     }44 45     public void setAge(int age)46     {47         this.age = age;48     }49 }
View Code

测试类:

技术分享
 1 package reflection; 2  3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6  7 public class Test 8 { 9     public static void main(String[] args) throws Exception10     {11         //获取类DemoTest的Class对象12         Class<?> c = Class.forName("reflection.DemoTest");13         //打印该Class对象对表示的类的名称14         System.out.println(c.getName());15         //获取该类的实例16         System.out.println(c.newInstance());17         18         System.out.println("-------------------------------------------");19         //获取该类实现的接口20         Class<?>[] interfaces = c.getInterfaces();21         System.out.println(interfaces[0].getName());22         23         System.out.println("-------------------------------------------");24         //获取有参构造函数25         Constructor<?> con = c.getConstructor(String.class,int.class);26         DemoTest dt = (DemoTest)con.newInstance("xiaoming",12);27         System.out.println(dt.getAge());28         29         System.out.println("-------------------------------------------");30         //获取类的成员变量31         Field f2 = c.getField("age");32         System.out.println(f2);33         //获取指定对象上该字段表示的值34         System.out.println(f2.get(dt));35         36         System.out.println("-------------------------------------------");37         //获取指定的方法38         Method m = c.getMethod("sayHello", String.class);39         //反射调用方法,非常重要40         m.invoke(dt, "hangzhou");41     }42 }
View Code

测试结果:

技术分享
 1 reflection.DemoTest 2 reflection.DemoTest@15db9742 3 ------------------------------------------- 4 java.io.Serializable 5 ------------------------------------------- 6 12 7 ------------------------------------------- 8 public int reflection.DemoTest.age 9 1210 -------------------------------------------11 hello hangzhou
View Code

 

五、参考资料

http://www.cnblogs.com/dongguacai/p/6535417.html (mainly pick from which)

http://www.cnblogs.com/lzq198754/p/5780331.html(more examples)

 

Java反射