反射--(代码实现)

来源:互联网 发布:linux配置网络 编辑:程序博客网 时间:2024/06/07 23:56
 

  创建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属性赋值为2312         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 value10      * @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 }

 

0 0
原创粉丝点击