Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 反射之私有构造函数、属性、方法
【标  题】:反射之私有构造函数、属性、方法
【关键字】:
【来  源】:http://www.blogjava.net/beauty_beast/archive/2006/05/15/46264.html

反射之私有构造函数、属性、方法

Your Ad Here

我一直以为类的私有构造函数、属性、方法除了类自身其他类是无法访问的,前几天正好学习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.length;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 安全性方面了解不多,实际开发中也很少与之相关,如哪位同行有相关经验,请多多指教,谢谢!




编程使用SDO[EMF兄弟篇]:【上一篇】
RIAWork介绍之二:静态以及动态性质的分离处理:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • DLL中调用约定和名称修饰
  • ubuntu足够安全吗?
  • Base ClearCase与ClearQuest的集成
  • Xwindow读书笔记3
  • PHP+MySQL下分页显示的实现
  • 并口编程参考资料
  • 让Foxmail也能收发yeah.net邮件
  • Web Service学习笔记之----JAX-RPC
  • 希网动态域名笔记
  • Nutch入门教程,第一部分
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.