反射练习一

 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 */

 

posted @ 2021-01-05 15:00  dog_IT  阅读(103)  评论(0编辑  收藏  举报