zoukankan      html  css  js  c++  java
  • JavaSE:反射机制

    1.  基本概念

        java.lang.reflect.Field类:主要用于描述获取到的单个成员变量信息

    2.  Class类中,和Field有关的常用方法

    方法声明 功能介绍
    Field getDeclaredField(String name) 用于获取此Class对象所表示类中参数指定的单个成员变量信息
    Field[] getDeclaredField() 用于获取此Class对象所表示类中所有成员变量信息

    3.  Field类的常用方法

    Object get(Object obj) 获取参数对象obj中,此Field对象所表示成员变量的数值
    void set(Object obj, Object value) 将参数对象obj中,此Field对象表示成员变量的数值,修改为参数value的数值
    void setAccessible(boolean flag) 当实参传递true时,则反射对象在使用时,应该取消java语言访问调查
    int getModifiers() 获取成员变量的访问修饰符
    Class<?> getType() 获取成员变量的数据类型
    String getName() 获取成员变量的名称

    4.  代码示例

     1 class PersonFieldTest {
     2 
     3     main() throws Exception {
     4 
     5     
     6 
     7       //  1.  使用原始方式,构造对象以及成员变量的数值,并打印
     8 
     9       Person p1 = new Person("zhangfei",30);
    10 
    11       //  println("获取到的成员变量数值为:" + p1.name);  //  zhangfei 
    12 
    13  
    14 
    15       //  2.  使用反射机制来构造对象,以及获取成员变量的数值,并打印
    16 
    17       //  2.1   获取Class对象
    18 
    19       Class c1 = Class.forName("com.lagou.task20.Person");
    20 
    21       //  2.2  根据Class对象,获取对应的有参构造方法
    22 
    23       Constructor constructor = c1.getConstructor(String.class, int.class);
    24 
    25       //  2.3  使用有参构造方法,得到Person类型的对象
    26 
    27       Object object = constructor.newInstance("zhangfei",30);
    28 
    29       //  2.4  根据Class对象,获取对应的成员变量信息
    30 
    31       Field field = c1.getDeclaredField("name");
    32 
    33       //  设置Java语言访问检查的取消  暴力反射
    34 
    35       field.setAccessible(true);
    36 
    37       //  2.5  使用Person类型的对象,来获取成员变量的数值,并打印
    38 
    39       //  获取对象object中,名字为field成员变量的数值,也就是成员变量name的数值
    40 
    41       print("获取到的成员变量数值为:" + field.get(object) );  //  zhangfei
    42 
    43  
    44 
    45       //  3.  使用原始方式,修改指定对象中,成员变量的数值后,再次打印
    46 
    47       //  p1.name = "guanyu";
    48 
    49       //  print("修改后成员变量的数值为:" + p1.name);  //  guanyu
    50 
    51  
    52 
    53       //  4.  使用反射机制,修改指定对象中成员变量的数值后,再次打印
    54 
    55       //  表示修改对象object中,名字为field成员变量的数值为guanyu,也就是成员变量name的数值为guanyu
    56 
    57       field.set(object,"guanyu");
    58 
    59       println("修改后成员变量的数值为:" + field.get(object) );  //  guanyu
    60 
    61  
    62 
    63       //  5.  获取Class对象对应类中,所有的成员变量
    64 
    65       Field[] declaredFields = c1.getDeclaredFields();
    66 
    67       for (Field ft : declearedFields) {
    68 
    69         print("获取到的访问修饰符为:" + ft.getModifiers() );
    70 
    71         print("获取到的数据类型为:" + ft.getType() );
    72 
    73         print("获取到的成员变量名称是:" + ft.getName() );      
    74 
    75       }
    76 
    77     }
    78 
    79 }

    <1>  

    <2>

     

    暴力反射:

     

     <3>获取Class对象对应类中,所有的成员变量

      (获取Person类中的name 和 age)

    运行效果:

    private修饰符对应的值为2:

  • 相关阅读:
    这是一个数学题牛客训练赛E
    最好使用%f输出浮点数据,acm
    hdu 1263 水果 结构的排序+sort自定义排序
    多校寒训TaoTao要吃鸡dp
    计算直角坐标系的面积并和面积交和周长并(可小数)
    Codeforces Round #620 (Div. 2)E LCA
    Codeforces Round #620 (Div. 2)D dilworld定理
    Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
    poj2243 给出m个模式串,求长度小于n的且存在模式串的字符串数有多少个(a~z)(思维构造+ac自动机)
    poj2778 求构造长度为n的字符串不包含给定的m个字符串的个数(矩阵乘法+ac自动机)
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14888721.html
Copyright © 2011-2022 走看看