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

在学习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异常。

时间: 2024-10-01 03:34:41

Java中反射获取私有构造函数、属性、方法的相关文章

Java中Spring获取bean方法小结_java

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

Java中反射的一个简单使用_java

简介 首先介绍一些不太实用的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 简单使用 反射,在java中是非常常见和好用的一种方式,(但是大家需要知道,他的效率是比较低的,所以要慎用)当然在基于java语言而产生的Android中也是可以使用的,我们可以使用反射来获取一些系统并不开放,但是存在的类,从而调用他的一些方法,下面就简单的写一下

java 中反射的应用

java 中反射的应用:   1,获取指定类的所有成员变量,包括父类的成员变量: /*** * get all field ,including fields in father/super class * * @param clazz * @return */ public static List<Field> getAllFields(Class clazz) { List<Field> fieldsList = new ArrayList<Field>();//

解析Java中如何获取Spring中配置的bean

本篇文章是对在Java中如何获取Spring中配置的bean进行了详细的分析介绍,需要的朋友参考下   一.什么是Spring?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 二.如何在程序中获取Spring配置的bean呢?方法一:在初始化时保存ApplicationContext对象代码: 复制代码 代码如下: ApplicationContext ac = new FileSystemXmlApplicationContex("applicationContex

java中一个对象可以有多少个属性

问题描述 java中一个对象可以有多少个属性 java中一个对象可以有多少个属性 有n个变量,有n个方法,有n个常量,可以这么理解么 解决方案 而且一个对象可以拥有数组作为成员变量,以另一个类类型作为变量,前者可以包含成千上万个元素,后者,这个变量对象内又可以有自己的成员变量. 一个类还可以从它的基类得到成员.方法. 解决方案二: 这个没有算过,但是有个1000个应该没问题. 解决方案三: 想多少有多少 (在存储空间允许的范围内) 解决方案四: 对象的属性分为静态属性,和动态属性,成员变量可以视

actionform获取值-java中actionForm获取值得问题

问题描述 java中actionForm获取值得问题 java中actionForm获取值得问题 web开发中继承原始的actionForm类后,actionForm中的属性是如何获取页面传递的值 解决方案 第一次发帖都没人来回答,还是自己结贴吧

spring中如何获取注入bean里方法上的注解?

问题描述 spring中如何获取注入bean里方法上的注解? 有这样一个需求,在spring中,想用反射获取一个注入bean中方法的注解 一般情况下这样的操作就行了: Method method = bean.getClass().getMethod(...); Annotation[] annotations = method.getAnnotations(); 这样就能获取注解了. 但在spring中,这种方法是获取不到annotation的,原因是这里的bean其实是一个代理类.那么问题来

大神帮帮忙-java中如何获取一个文件的文件头信息

问题描述 java中如何获取一个文件的文件头信息 有没有一个方法获取一个文件的文件头.这个文件是a.exe,求教了! 解决方案 exe使用的是pe格式,参考:http://www.cnblogs.com/lzjsky/archive/2011/09/22/2184942.html 解决方案二: 所谓文件头,没有一个确切的概念,不同的文件类型,文件头的含义不同,长度不同. 如果你希望简单判断下文件类型,那么你只需要读取文件开头几个字节,这不算文件头,一般叫做文件特征. 比如exe,它开头两个字节应

js基础之DOM中document对象的常用属性方法详解_javascript技巧

-----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返回对文档中所有 Anchor 对象的引用.还有document.links/document.forms/document.images等 2  document.URL       返回当前文档的url 3  document.title       返回当前文档的标题 4  do