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:

  • 相关阅读:
    Hadoop 2.5.1集群安装配置
    Hadoop 2.5.1编译
    CloudStack安装
    Swift安装
    频率分布折线图与总体密度曲线
    频率直方图(hist)
    分位数(quantile)
    茎叶图(stem)
    盒图(boxplot)
    R语言学习
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14888721.html
Copyright © 2011-2022 走看看