论坛首页 招聘求职论坛

大家有没有同样的迷茫的感觉 2年JAVA经验走入误区

浏览 16914 次
精华帖 (3) :: 良好帖 (1) :: 隐藏帖 (8)
作者 正文
   发表时间:2009-07-31  
封装和反射互不矛盾,反射本身也是为了更加灵活的封装。
0 请登录后投票
   发表时间: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());
}
}
}
}
0 请登录后投票
   发表时间:2009-07-31  
supercrsky 写道
liwenshui322 写道
封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
    建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”!

怎么不能直接访问私有变量吗?可以吧。

私有变面可以访问,并且无需提供GET,SET方法,通过反射也能修改,包括在非同包中访问私有方法,私有变量,私有构造方法...主要感觉这太不安全了,假如在序列化传输时候,被抓包,如抓包者持有此对象的.class文件,就能获取所有私有信息,那么在安全性上不就存在很大的危险了么...当然这是没有用过加密算法的情况下...
0 请登录后投票
   发表时间: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),访问权限被修改,然后即可操作私有方法,变量,构造函数
0 请登录后投票
   发表时间:2009-07-31  
同意楼上,记得以前做过类似的东西,可以访问私有变量,不用什么getter setter.
0 请登录后投票
   发表时间:2009-07-31  
mark_wang_9527 写道
supercrsky 写道
liwenshui322 写道
封装并不是封死,总得有个途径去访问你存放的变量吧?反射的原理就是在虚拟机内部实例化了一个对象,通过这个对象去访问它自己的属性!不过它也不能直接访问它的私有变量,得通过我们通常所说的GET与SET方法。其实我们在写这样的代码:LawyerInfo li=new LawyerInfo();实例化一个对象的时候,虚拟机内部也用的是反射原理!
    建议你去看看《深入JAVA虚拟机》这本书,它应该能够让你“大彻大悟”!

怎么不能直接访问私有变量吗?可以吧。

私有变面可以访问,并且无需提供GET,SET方法,通过反射也能修改,包括在非同包中访问私有方法,私有变量,私有构造方法...主要感觉这太不安全了,假如在序列化传输时候,被抓包,如抓包者持有此对象的.class文件,就能获取所有私有信息,那么在安全性上不就存在很大的危险了么...当然这是没有用过加密算法的情况下...


反射访问私有变量和你这里所说的安全完全不是一回事。。。。
0 请登录后投票
   发表时间: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等其他语言是否存在同样的情况...
0 请登录后投票
   发表时间:2009-07-31  
感慨一下,不仅core java,网络,操作系统,数据库,数据结构重要,连数学都相当重要。 框架嘛,第一年工作的时候感兴趣,第二年的时候就觉得没意思了。
0 请登录后投票
   发表时间:2009-07-31  
这说明楼主已经开始thinking in java了,不错啊
0 请登录后投票
   发表时间:2009-07-31   最后修改:2009-07-31
两年的路过.
鄙人浅见,语言本身也只是工具,能解决问题就可以了,何必局限于一种呢?
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics