反射练习一
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 */