反射--(代码实现)

 

  创建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 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jusenr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值