栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
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方法