一、什么是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 }
测试类:
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 Exception
10 {
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 }
测试结果:
reflection.DemoTest
reflection.DemoTest@15db9742
-------------------------------------------
java.io.Serializable
-------------------------------------------
12
-------------------------------------------
public int reflection.DemoTest.age
12
-------------------------------------------
hello hangzhou