1 import java.lang.reflect.*;
2 public class Demo12{
3 public static void main(String[] args) throws Exception{ //记住要抛出异常
4 Person p = new Student();
5 //获取Class对象
6 Class cls = p.getClass();
7 //对于当前类中private修饰的方法,必须使用getDeclaredMethod方法才可以获取
8 Method m1 = cls.getDeclaredMethod("eat");
9 //对于private修饰的方式,在通过反射调用前,必须先设置允许访问为true
10 m1.setAccessible(true);
11 m1.invoke(p);
12 Method m2 = cls.getMethod("hello",String.class);
13 //new Student() 是匿名类
14 m2.invoke(new Student(),"tiantian");
15 Field f = cls.getField("name");
16 System.out.println(f.get(p)); //?
17 m2.invoke(p,"tiantian");
18 System.out.println(cls.getField("name").get(p)); //?
19 }
20 }
21
22 class Student extends Person {
23 public void hello(String name) {
24 this.name = name;
25 System.out.println("Hello,student:" + name);
26 }
27
28 private void eat(){
29 System.out.println("student:I am eating breakfast");
30 }
31 }
32
33 class Person {
34 public String name;
35
36 public void hello(String name) {
37 this.name = name;
38 System.out.println("Hello,person:" + name);
39 }
40 }
41
42 /*
43 第一个问号处输出 null
44 第二个问号处输出 wangwang
45
46 分析:因为new Student()这个对象没有引用变量指向它,所以是一个匿名类,只能使用new Student().方法或者new Student().成员变量的调用方式出现一次,下次就没法再使用这个类了。因此
47 程序执行m2.invoke(new Student(),"tiantian"),通过反射调用hello(String name)方法传参,给这个匿名类属性name赋值为wangwang,但接下来也是没有任何语句去访问这个name属性值的
48 两个?号处代码其实打印的都是读取p对象的name属性值
49 第一个问号处,此时p对象的name属性值还没有通过反射调用方法传参被赋值,所以name属性是初始化值null
50 第二个问号处的上面,p对象的name属性值通过反射调用hello(String name)方法传参,name属性被赋值为wangwang,所以打印结果就是wangwang
51 */