• 反射练习一


     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 */
  • 相关阅读:
    Redis源码剖析之字典(dict)
    Redis源码剖析之跳表(skiplist)
    面试题精选:神奇的斐波那契数列
    awk实现类sql的join操作
    [翻译]CAP理论及其证明
    今年是冷冬?我爬了北京10年的气温,哟 还真是!
    python 等间隔抽取一定数量的数据
    操作系统-第十章-文件系统
    操作系统-第九章-虚拟内存管理
    操作系统-第八章-内存管理
  • 原文地址:https://www.cnblogs.com/zui-ai-java/p/14235856.html
Copyright © 2020-2023  润新知