zoukankan      html  css  js  c++  java
  • 反射练习一

     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 */
  • 相关阅读:
    MBR记录
    execute,executeQuery,executeUpdate的区别是什么?
    JDBC访问数据库的基本步骤是什么?
    什么是JDBC,在上面时候会用到它?
    int 和 Integer 有什么区别
    String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
    final finally finalize区别
    Java有哪些基本数据类型
    面向过程和面向对象的区别
    JDK,JRE,JVM三者关系
  • 原文地址:https://www.cnblogs.com/zui-ai-java/p/14235856.html
Copyright © 2011-2022 走看看