A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.lang.reflect.Field;


  2. public class ReflectFinal {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) throws Exception {
  7.                 Person p1 = new Person("郭宁",23);
  8.                 System.out.println(p1.name+"  "+p1.getAge());
  9.                 Field field = p1.getClass().getDeclaredField("age");
  10.                 field.setAccessible(true);
  11.                 field.set(p1, 99);
  12.                 System.out.println(p1.name+"  "+p1.getAge());

  13.         }

  14. }




  15. class Person{
  16.         private final int age;
  17.         public String name="我是初始化的";
  18.        
  19.         Person(String name,int age){
  20.                 this.name=name;
  21.                 this.age = age;
  22.         }
  23.         public int getAge(){return age;}
  24. }
复制代码
结果:
郭宁  23
郭宁  99

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

14 个回复

倒序浏览
自己顶一下!!
回复 使用道具 举报
求指导啊~~~
回复 使用道具 举报
本帖最后由 杜俊彪 于 2012-6-2 10:46 编辑

哦,  我运行了一下,确实可以  
回复 使用道具 举报
杜俊彪 发表于 2012-6-2 10:41
哦,  我运行了一下,确实可以

这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值?
回复 使用道具 举报
杜俊彪 发表于 2012-6-2 10:41
哦,  我运行了一下,确实可以

这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值?
回复 使用道具 举报
木有人来解释一下么?
回复 使用道具 举报
郭宁 发表于 2012-6-2 10:48
这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值? ...

我只能这么说:  final修饰的变量的值是可以改变的;     如果你写成private final int AGE=1 ;这样就不可变了吧
回复 使用道具 举报
杜俊彪 发表于 2012-6-2 11:03
我只能这么说:  final修饰的变量的值是可以改变的;     如果你写成private final int AGE=1 ;这样就不 ...

确实!
不过我还是不明白啊~
final 在构造函数不是也可以赋值一次么?
为何还能再改变?
莫非final在这里就不是终态了?
回复 使用道具 举报
难道这是反射的魅力,  也体现了反射的灵活性;   确实 final修饰的变量只能赋值一次,  但通过反射机制来field.set(p1, n);  却可以多次改变其值 ;  这个我想听听你对反射的理解了,,
回复 使用道具 举报
杜俊彪 发表于 2012-6-2 11:29
难道这是反射的魅力,  也体现了反射的灵活性;   确实 final修饰的变量只能赋值一次,  但通过反射机制来f ...

我昨天晚上才开始看的反射视频,只知皮毛,不然也不会这么多迷惑了。
回复 使用道具 举报
木有人来回答~o(︶︿︶)o 唉
回复 使用道具 举报
反射不是这么玩的,杀鸡焉用牛刀?不过反射确实很强大倒是
回复 使用道具 举报
刘蕴学 发表于 2012-6-2 12:00
反射不是这么玩的,杀鸡焉用牛刀?不过反射确实很强大倒是

看来真的是可以了~
就像初中物理坚信的定律到了高中才发现原来是错的

点评

这到是,不过反射的好处,你还没接触到,呵呵  发表于 2012-6-2 12:31
回复 使用道具 举报
再加个静态就不能反射了..

点评

getDeclaredField()方法可以拿到静态成员,跟getField()拿到的字段访问方式有点区别,静态成员不需要实例对象做为参数  发表于 2012-6-2 22:21
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马