黑马程序员技术交流社区

标题: 强大的反射~秒杀private~final 再一次不淡定 有木有啊~~~!!... [打印本页]

作者: 郭宁    时间: 2012-6-2 10:20
标题: 强大的反射~秒杀private~final 再一次不淡定 有木有啊~~~!!...
  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
作者: 郭宁    时间: 2012-6-2 10:24
自己顶一下!!
作者: 郭宁    时间: 2012-6-2 10:30
求指导啊~~~
作者: 杜俊彪    时间: 2012-6-2 10:41
本帖最后由 杜俊彪 于 2012-6-2 10:46 编辑

哦,  我运行了一下,确实可以  
作者: 郭宁    时间: 2012-6-2 10:48
杜俊彪 发表于 2012-6-2 10:41
哦,  我运行了一下,确实可以

这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值?
作者: 郭宁    时间: 2012-6-2 10:48
杜俊彪 发表于 2012-6-2 10:41
哦,  我运行了一下,确实可以

这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值?
作者: 郭宁    时间: 2012-6-2 11:01
木有人来解释一下么?
作者: 杜俊彪    时间: 2012-6-2 11:03
郭宁 发表于 2012-6-2 10:48
这个不是主要矛盾,
主要矛盾是~ 为什么 final 修饰后 还可以用反射修改它的值? ...

我只能这么说:  final修饰的变量的值是可以改变的;     如果你写成private final int AGE=1 ;这样就不可变了吧
作者: 郭宁    时间: 2012-6-2 11:21
杜俊彪 发表于 2012-6-2 11:03
我只能这么说:  final修饰的变量的值是可以改变的;     如果你写成private final int AGE=1 ;这样就不 ...

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

我昨天晚上才开始看的反射视频,只知皮毛,不然也不会这么多迷惑了。

作者: 郭宁    时间: 2012-6-2 11:38
木有人来回答~o(︶︿︶)o 唉
作者: 刘蕴学    时间: 2012-6-2 12:00
反射不是这么玩的,杀鸡焉用牛刀?不过反射确实很强大倒是
作者: 郭宁    时间: 2012-6-2 12:14
刘蕴学 发表于 2012-6-2 12:00
反射不是这么玩的,杀鸡焉用牛刀?不过反射确实很强大倒是

看来真的是可以了~
就像初中物理坚信的定律到了高中才发现原来是错的
作者: 林豪    时间: 2012-6-2 12:39
再加个静态就不能反射了..




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2