什么是java的反射:
1.在运行状态中,对于任何一个类,都能够知道这个类的所有方法和属性。
2.对任意一个对象都能调用它的任何方法和属性。
这种动态获取信息和动态调用一个对象的方法和属性的机制就是java反射。
反射的作用:java程序可以加载一个运行时才得知名称的class,通过class的全限定名,利用java反射机制就可以获取该类的全部信息,可以动态的创建对象和编译。
三、反射的原理
JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。
反射的实现主要借助以下四个类:
Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象
1、获取类对象:
通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");
通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();
也可以通过构造函数来实例化该类:
Constructor<?> con = c.getConstructor(String.class,int.class);
DemoTest dt = (DemoTest)con.newInstance("xiaoming",12);
四、代码演示
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