`

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 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    这些代码可能包括创建枚举类,然后通过反射获取枚举值、实例名以及演示如何使用`getDeclaredConstructor()`和`newInstance()`方法来访问私有构造函数(虽然这不是常规用法)。 通过深入理解这些概念,你可以更好地...

    反射修改私有成员变量例子

    反射机制提供了一种方式来在运行时检查类的成员变量、方法和构造函数,并且可以在运行时修改它们的行为。 为什么需要 Java 反射机制? Java 反射机制可以帮助我们解决一些特殊的问题,例如: * 动态修改类的成员...

    Java反射机制,通过对象访问调用类的私有成员或方法

    我们可以通过`Class`对象来获取关于一个类的所有信息,包括其构造函数、方法、字段等。获取`Class`对象主要有三种方式:使用`Class.forName()`方法,通过类的`.class`属性,或者直接对类实例使用`getClass()`方法。 ...

    JAVA反射机制的入门代码

    3. **访问字段**:通过`Class`对象的`getFields()`或`getDeclaredFields()`方法获取所有公共或私有字段,然后使用`Field`对象的`get()`或`set()`方法读取或修改对象的字段值。 4. **调用方法**:使用`Class`对象的`...

    反射实例-JAVA反射机制.doc

    Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身的行为。然而,反射...

    java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性以及处理数组等。在本篇讲解中,我们将深入理解如何通过反射来执行方法、操作属性以及处理...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    JAVA反射知识总结

    - 获取私有构造函数:使用`getDeclaredConstructor(参数类型.class)`方法获取,然后通过调用`setAccessible(true)`使私有构造函数在外部可访问,并使用`newInstance(参数值)`进行实例化。 4. 普通方法的反射操作: ...

    反射实例-JAVA反射机制

    在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...

    Java反射性能测试分析

    为了准确评估Java反射的性能,我们设计了一系列基准测试,涵盖了反射操作的各个方面,如动态创建对象、设置和获取字段值、调用方法等。测试环境为标准的Java开发环境,采用最新的JDK版本,以确保结果的可靠性和...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    我们可以通过`Class.forName()`方法或者对象的`getClass()`方法获取到`Class`实例。一旦有了`Class`对象,我们就可以获取类的元数据,包括类名、包名、父类、接口、字段和方法等信息。 `Constructor`类代表类的构造...

    通过构造及反射实现类属性赋值

    标题中的“通过构造及反射实现类属性赋值”涉及到的技术是Java的构造函数和反射机制。这两种方法在特定场景下能帮助我们更灵活、更深入地处理对象属性的复制。 首先,构造函数是创建新对象时调用的特殊方法,它可以...

    Java反射机制

    Java反射相关的API主要位于`java.lang.reflect`包中,这些API提供了操作类、构造函数、方法和字段的功能。以下是一些核心API: 1. **`java.lang.Class`**:表示类的类型,可以通过多种方式获取,如`Class.forName()...

    java反射简单例子demo

    `getConstructor`是`Class`类的另一个方法,它用于获取类的指定构造函数。与`getDeclaredMethod`类似,它需要一个参数类型数组来指定构造函数的参数类型。这样可以方便地实例化类,即使构造函数是私有的: ```java ...

    北大青鸟java反射机制

    `Constructor`类代表了类的构造函数,我们可以通过`getConstructors()`获取公共构造器,`getDeclaredConstructors()`获取所有构造器。然后使用`newInstance(Object... initargs)`创建新的对象。 此外,Java反射机制...

    java 反射机制例子

    对于构造函数、字段和方法这三类组件,`java.lang.Class`提供了多种反射调用来获取相关信息。这些调用遵循统一的标准格式,例如: - `Constructor getConstructor(Class[] params)` —— 获取具有特定参数类型的...

    Java反射案例

    使用`Class.newInstance()`方法可以无参构造函数创建对象,但如果有参数的构造函数,需要通过`Constructor`类的`getDeclaredConstructor()`或`getConstructor()`方法获取构造器,然后调用`newInstance()`创建对象。...

    java反射机制详解与应用

    Java反射机制是Java语言的一项强大功能,它允许程序在运行时动态地获取类的信息并操作类的对象。这一特性使得Java具有高度的灵活性和强大的扩展性,尤其是在开发框架和库时,反射机制起到了至关重要的作用。本文将...

    java 反射机制详解

    - **测试工具**:JUnit 等测试框架利用反射来调用私有方法或构造函数。 - **动态代理**:在不修改原有代码的情况下,为类添加额外的功能。 然而,反射也存在一定的性能开销,因为它打破了 Java 的封装性和安全性,...

Global site tag (gtag.js) - Google Analytics