首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:Java反射获取私有构造函数、属性、方法

Java反射获取私有构造函数、属性、方法

www.jz123.cn  2010-05-25   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

  我一直以为类的私有构造函数、属性、方法除了类自身其他类是无法访问的,前几天正好学习Spring框架,在学习Spring框架基础 Bean包时,写了一个简单的例子,类似如下:

  package study.spring.bean;

  public class SimpleBean

  {

  private String beanName;

  private SimpleBean() {

  System.out.println( " SimpleBean " );

  }

  /** */ /**

  * @return Returns the beanName.

  */

  public String getBeanName()

  {

  return beanName;

  }

  /** */ /**

  * @param beanName The beanName to set.

  */

  public void setBeanName(String beanName)

  {

  this .beanName = beanName;

  }

  }

  发现居然也能调用成功,当时很惊讶,反射机制平时在以前的项目中也常使用,但不能构造只有私有构造函数的类。

  自己做了一个简单例子:

  package study.spring.bean;

  import java.lang.reflect.Constructor;

  import java.lang.reflect.InvocationTargetException;

  public class SimpleTest

  {

  /** *//**

  * @param args

  */

  public static void main(String[] args)

  {

  // TODO Auto-generated method stub

  try

  {

  Constructor[] cts=Class.forName("study.spring.bean.SimpleBean").getDeclaredConstructors();

  for(int i=0;i

  cts[i].newInstance(null);

  }

  }

  catch (SecurityException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  catch (ClassNotFoundException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  catch (IllegalArgumentException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  catch (InstantiationException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  catch (IllegalAccessException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  catch (InvocationTargetException e)

  {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

  也是如我所想 抛出java.lang.IllegalAccessException异常,当时就怀疑Spring框架是否使用反射的一些特性,后来查了相关文档才知道原因何在:

  实际上java在反射创建一个类的实例时,默认会检测是否符合相关安全,该检测开关可以关闭。

  Constructor、Field、Method都是继承于AccessibleObject,对应实例调用setAccessible(true)就关闭该开关

  如上面的例子,在代码 cts[i].newInstance(null);行前调用上述方法: cts[i].setAccessible(true);

  这样就可以创建只有构造函数的实例、调用私有构造方法,访问类的私有属性。

  呵呵,这样好像java安全性就大大降低.如果你非常注重应用的安全性,java当然考虑到这方面,你可以在JVM启动参数增加 -Djava.security.manager 启用安全管理器,如果有该参数,它将检测正在关闭接入检测的代码是否许可了这样做,上述代码执行时会抛出java.security.AccessControlException异常。


上一篇:理解Java的GC与幽灵引用 下一篇:简化Java日期操作的开源项目DATE4J方法

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图