• 反射--(代码实现)


      创建Student类

     1 public class Student {
     2 
     3     private String name ;
     4     
     5     private int age ;
     6 
     7     @Override
     8     public String toString() {
     9         return "Student [name=" + name + ", age=" + age + "]";
    10     }
    11 }

      创建StudentDemo类

     1 public class StudentDemo {
     2     
     3     public static void main(String[] args) throws Exception {
     4         
     5         // 创建Student对象
     6         Student s = new Student() ;
     7         
     8         // 给s这个对象的name属性赋值为"张三"
     9         PropertiesTools.setProperty(s, "name", "张三") ;
    10         
    11         // 给s这个对象的age属性赋值为23
    12         PropertiesTools.setProperty(s, "age", 23) ;
    13         
    14         // 输出
    15         System.out.println(s);
    16         
    17     }
    18 }

      创建ReflectTest类

     1 import java.lang.reflect.Method;
     2 import java.util.ArrayList;
     3 
     4 public class ReflectTest {
     5     
     6     public static void main(String[] args) throws Exception {
     7         
     8         /**
     9          * 我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
    10          */
    11         // 创建一个ArrayList集合
    12         ArrayList<Integer> al = new ArrayList<Integer>() ;
    13         
    14         /**
    15          * 当我们添加了泛型以后,就规定了该集合只能存储Integer类型的数据,而泛型这种机制只是在编译器有效,到了
    16          * 运行期,这个泛型就不存在了,而这个动作叫做泛型擦除.由此可见在编译期好像完成不了,但是我们可以在运行期
    17          * 对其进行操作,要在运行期完成,就需要使用反射
    18          */
    19         
    20         // 添加
    21         al.add(23) ;
    22         
    23         // 获取字节码文件对象
    24         Class clazz = al.getClass() ;
    25         
    26         // 获取add方法
    27         Method method = clazz.getDeclaredMethod("add", Object.class) ;
    28         
    29         // 调用方法
    30         method.invoke(al, "你好") ;
    31         
    32         // 输出
    33         System.out.println(al);
    34     }
    35 
    36 }

      创建PropertiesTools类

     1 import java.lang.reflect.Field;
     2 
     3 public class PropertiesTools {
     4     
     5     /**
     6      * 作用: 是给obj这个对象的propertyName这个属性设置上value这个值
     7      * @param obj
     8      * @param propertyName
     9      * @param value
    10      * @throws Exception 
    11      */
    12     public static void setProperty(Object obj , String propertyName , Object value) throws Exception{
    13         
    14         // 获取obj这个对象对应的字节码文件对象
    15         Class clazz = obj.getClass() ;
    16         
    17         // 获取propertyName这个属性
    18         Field field = clazz.getDeclaredField(propertyName) ;
    19         
    20         // 取消语法检查
    21         field.setAccessible(true) ;
    22         
    23         // 调用方法赋值
    24         field.set(obj, value) ;
    25     }
    26 }
  • 相关阅读:
    马拉车算法【Manachar】
    AcWing算法进阶课 基础算法 启发式合并
    iframe嵌套跨域子页面变化高度自适应
    js数组中的每一项异步请求
    利用geo3d地图数据画地图上面的柱子
    地图上面加柱状图组
    antd-select选项位置偏移问题解决
    git
    React
    前端面试题
  • 原文地址:https://www.cnblogs.com/rongsnow/p/5157148.html
Copyright © 2020-2023  润新知