精华帖 (3) :: 良好帖 (1) :: 隐藏帖 (8)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-31
封装和反射互不矛盾,反射本身也是为了更加灵活的封装。
|
|
返回顶楼 | |
发表时间:2009-07-31
supercrsky 写道 liwenshui322 写道 封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”! 怎么不能直接访问私有变量吗?可以吧。 是不可以!你可以自己试一下. 代码如下: public class ReflectionObj { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } //测试类 import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectionTest { public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { //初始化一个实例 ReflectionObj ro=new ReflectionObj(); ro.setId(0); ro.setName("xiaohua"); //获取CLASS类的实例 Class c=ro.getClass(); //获取这个对象声明的属性 Field[] f=c.getDeclaredFields(); //试着通过属性本身获得属性值 for(int i=0;i<f.length;i++){ System.out.println(f[i].get(ro)); } //这个对象的方法对象数组 Method[] m=c.getDeclaredMethods(); //通过调用方法获取属性值 for(int i=0;i<m.length;i++){ if(m[i].getName().startsWith("get")){ System.out.println(m[i].invoke(ro).toString()); } } } } |
|
返回顶楼 | |
发表时间:2009-07-31
supercrsky 写道 liwenshui322 写道 封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”! 怎么不能直接访问私有变量吗?可以吧。 私有变面可以访问,并且无需提供GET,SET方法,通过反射也能修改,包括在非同包中访问私有方法,私有变量,私有构造方法...主要感觉这太不安全了,假如在序列化传输时候,被抓包,如抓包者持有此对象的.class文件,就能获取所有私有信息,那么在安全性上不就存在很大的危险了么...当然这是没有用过加密算法的情况下... |
|
返回顶楼 | |
发表时间:2009-07-31
liwenshui322 写道 supercrsky 写道 liwenshui322 写道 封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”! 怎么不能直接访问私有变量吗?可以吧。 是不可以!你可以自己试一下. 代码如下: public class ReflectionObj { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } //测试类 import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectionTest { public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { //初始化一个实例 ReflectionObj ro=new ReflectionObj(); ro.setId(0); ro.setName("xiaohua"); //获取CLASS类的实例 Class c=ro.getClass(); //获取这个对象声明的属性 Field[] f=c.getDeclaredFields(); //试着通过属性本身获得属性值 for(int i=0;i<f.length;i++){ System.out.println(f[i].get(ro)); } //这个对象的方法对象数组 Method[] m=c.getDeclaredMethods(); //通过调用方法获取属性值 for(int i=0;i<m.length;i++){ if(m[i].getName().startsWith("get")){ System.out.println(m[i].invoke(ro).toString()); } } } } 加上setAccessible(true),访问权限被修改,然后即可操作私有方法,变量,构造函数 |
|
返回顶楼 | |
发表时间:2009-07-31
同意楼上,记得以前做过类似的东西,可以访问私有变量,不用什么getter setter.
|
|
返回顶楼 | |
发表时间:2009-07-31
mark_wang_9527 写道 supercrsky 写道 liwenshui322 写道 封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”! 怎么不能直接访问私有变量吗?可以吧。 私有变面可以访问,并且无需提供GET,SET方法,通过反射也能修改,包括在非同包中访问私有方法,私有变量,私有构造方法...主要感觉这太不安全了,假如在序列化传输时候,被抓包,如抓包者持有此对象的.class文件,就能获取所有私有信息,那么在安全性上不就存在很大的危险了么...当然这是没有用过加密算法的情况下... 反射访问私有变量和你这里所说的安全完全不是一回事。。。。 |
|
返回顶楼 | |
发表时间:2009-07-31
kaipingk 写道 mark_wang_9527 写道 supercrsky 写道 liwenshui322 写道 封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”! 怎么不能直接访问私有变量吗?可以吧。 私有变面可以访问,并且无需提供GET,SET方法,通过反射也能修改,包括在非同包中访问私有方法,私有变量,私有构造方法...主要感觉这太不安全了,假如在序列化传输时候,被抓包,如抓包者持有此对象的.class文件,就能获取所有私有信息,那么在安全性上不就存在很大的危险了么...当然这是没有用过加密算法的情况下... 反射访问私有变量和你这里所说的安全完全不是一回事。。。。 设置为私有成员变量不就为了控制访问作用域,使其不被暴露给第三方开发人员进行操作么,这当然牵扯到数据的安全性,健壮性,如果你私有成员变量值都被修改了,显然会存在很大的问题啊.虽然感觉反射带来了很大的便利,Spring的AOP,DI基本都是依赖反射机制,也自己写过Spring框架,不过发现其中确实存在太大的安全隐患了.不知道C++,Python等其他语言是否存在同样的情况... |
|
返回顶楼 | |
发表时间:2009-07-31
感慨一下,不仅core java,网络,操作系统,数据库,数据结构重要,连数学都相当重要。 框架嘛,第一年工作的时候感兴趣,第二年的时候就觉得没意思了。
|
|
返回顶楼 | |
发表时间:2009-07-31
这说明楼主已经开始thinking in java了,不错啊
|
|
返回顶楼 | |
发表时间:2009-07-31
最后修改:2009-07-31
两年的路过.
鄙人浅见,语言本身也只是工具,能解决问题就可以了,何必局限于一种呢? |
|
返回顶楼 | |