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

来源:本站
导读:目前正在解读《Java反射获取私有构造函数、属性、方法》的相关信息,《Java反射获取私有构造函数、属性、方法》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Java反射获取私有构造函数、属性、方法》的详细说明。
简介:介绍Java反射获取私有构造函数、属性、方法

我一直以为类的私有构造函数、属性、方法除了类自身其他类是无法访问的,前几天正好学习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反射获取私有构造函数、属性、方法》最后刷新时间 2024-03-14 01:04:35,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Java反射获取私有构造函数、属性、方法》该内容的真实性请自行鉴别。