`

反射私有方法

    博客分类:
  • java
阅读更多
曾经碰到一件怪事:Spring可以把构造函数为私有的对象实例也给创建出来,当时没去研究为何。直到今天突然想起,查了一下,找到此文:http://yh-private.iteye.com/blog/183345 ,于是给转了过来,javaeye没有直接转载的功能,真有些不方便啊。

1.私有构造函数的调用:
主要的类:java.lang.reflect.Constructor

首先要拿到构造方法,具体如下:
Class clazz = Class.forName("Bean");
Constructor[] cons = clazz.getDeclaredConstructors();
这样拿到的cons数组保存着所有的这个类的构造函数,包括私有的和公有的。
迭代并调用con.toGenericString()可以拿到每个构造方法的全限定名(带修饰符,带参数)。
如果要拿单个构造方法,可以调用getDeclaredConstructor(Class args);来拿,只要参数匹配了就可以得到,如果没有参数,则传null即可。

然后需要调用Constructor的方法setAccessible设置为true,表示允许使用私有构造函数。这个方法是父类 AccessibleObject的方法,这个类的自类有Constructor, Field, Method分别代表构造函数,成员变量,和成员方法。也就是说使用这个方法,可以访问类的所有的方法、变量、构造函数。

最后,使用Constructor的newInstance方法就可以把对象创建出来了:
Bean bean = (Bean)con.newInstance(Object args);
没有参数的构造函数可以传null进去。

2.调用私有的方法:
主要的类:java.lang.reflect.Method

首先还是要拿到那个私有的方法,可以调用
Method[] ms = clazz.getDeclaredMethods();来拿到所有的方法的集合。
也可以拿某个单独的方法:getDeclaredMethod(String name, Class... parameterTypes)匹配名字和参数的方法会被拿到,方法若没有参数传null.
同样可以调用toGenericString()看全限定名。

然后同样需要调用setAccessible(true)来设置可以方法私有方法。

最后,就可以使用method.invoke(bean, Object args);来调用这个方法。两个参数分别是对象,和这个方法的参数。

3.调用私有成员变量,也叫字段。
主要类:java.lang.reflect.Field

首先还是要拿到要使用的字段:
还是两种,拿全部:Field[] fs = clazz.getDeclaredFields();
拿某个:clazz.getDeclaredField(String fieldName);

老步骤:setAccessible(true)

最后, f.get(obj) ,就能拿到传入对象的私有变量。
MyBean.java : 

package cn.yzj.entities; 

public class MyBean
{
 private String name;
 private Integer age;
 
 private MyBean()
 {
  this.name ="ABC";
 } 

 private MyBean(String name,Integer age)
 {
  this.name = name;
  this.age = age;
 }
 
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 
 private void printName()
 {
  System.out.println(this.name);
 }
} 

package cn.yzj; 

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; 

import cn.yzj.entities.MyBean; 

public class Test1
{
 public static void main(String[] args) throws ClassNotFoundException,
   IllegalArgumentException, InstantiationException,
   IllegalAccessException, InvocationTargetException,
   SecurityException, NoSuchMethodException
 {
  Class clazz = Class.forName("cn.yzj.entities.MyBean"); 

  // 获得私有成员变量并返回.
  // getField(clazz); 

  // 调用私有方法
  // getMethod(clazz); 

  // 用私有构造方法构造对象并返回.
  // getConstrutor(clazz); 

 } 


 //用私有构造方法构建实例的方法
 private static MyBean getConstrutor(Class clazz)
   throws NoSuchMethodException, InstantiationException,
   IllegalAccessException, InvocationTargetException
 { 

  // 拿所有的构造方法.
  /*
   * Constructor[] cons = clazz.getDeclaredConstructors(); for(Constructor
   * con : cons) { System.out.println(con.toGenericString()); }
   */ 

  // 1.拿无参数的构造方法.
  Constructor con = clazz.getDeclaredConstructor(null); 

  // 2.设置可以访问.
  con.setAccessible(true); 

  // 3.创建实例
  MyBean myBean = (MyBean) con.newInstance(null);
  return myBean;
 } 

 private static Object getField(Class clazz) throws NoSuchMethodException,
   InstantiationException, IllegalAccessException,
   InvocationTargetException
 {
  MyBean myBean = getConstrutor(clazz); 

  Field[] fs = clazz.getDeclaredFields(); 

  for (Field f : fs)
  {
   System.out.println(f.toGenericString());
  } 

  fs[0].setAccessible(true); 

  return fs[0].get(myBean);
 } 

 private static void getMethod(Class clazz) throws NoSuchMethodException,
   InstantiationException, IllegalAccessException,
   InvocationTargetException
 {
  MyBean myBean = getConstrutor(clazz); 

  Method[] ms = clazz.getDeclaredMethods(); 

  for (Method m : ms)
  {
   System.out.println(m.toGenericString());
  } 

  ms[0].setAccessible(true); 

  ms[0].invoke(myBean, null);
 } 

}








分享到:
评论

相关推荐

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class对象**:首先,我们需要获取到目标类的Class对象,这可以通过`Class.forName()`方法或者对象的`getClass()`方法来实现。例如,...

    java反射机制,调用私有方法

    `Method`类提供了`getDeclaredMethod()`方法来获取类的私有方法,而`invoke()`方法则可以用来调用这个私有方法。 3. **创建对象**:使用`Class`类的`newInstance()`方法,我们可以动态地创建类的实例,无需知道具体...

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    Java 反射详解(包含私有方法属性的调用)

    对于私有方法和属性的访问,Java反射提供了一种特殊的方式。通常,私有成员在外部类是不可见的,但通过`java.lang.reflect.Method`和`java.lang.reflect.Field`类,我们可以绕过访问控制。例如,`Method`类的`...

    C#net反射实现访问类中的私有变量或者方法

    在本篇文章中,我们将深入探讨如何利用C#中的反射机制来访问类中的私有变量或方法。通过一个具体的示例代码,我们将详细了解反射的基本概念、使用场景以及如何具体操作。 ### 一、C#反射机制简介 #### 1.1 什么是...

    Java反射访问私有变量和私有方法.doc

    Java 反射访问私有变量和私有方法 Java 反射机制是 Java 语言中的一种强大的工具,使得我们可以在运行时装配代码,而无需在对象之间进行源代码链接,从而使代码更具灵活性。在实际测试中,我们经常需要访问类的非...

    C#私有成员反射调用类库

    要使用反射调用私有方法,首先需要获取到包含该方法的类型实例,然后找到相应的方法信息,最后通过Invoke方法执行该方法。以下是一个简单的示例: ```csharp using System; using System.Reflection; class ...

    php反射方法调用执行类中的私有方法.zip

    介绍一篇关于PHP通过反射方法调用执行类中的私有方法,希望这篇教程能够帮助到各位朋友,有兴趣的可以进来看看。具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    对私有方法进行单元测试

    例如,在`TestCaseHelper.java`中,可能会有一个私有方法`processData()`,我们可以使用反射来调用它并验证处理数据后的结果。 ```java Method privateMethod = TestCaseHelper.class.getDeclaredMethod(...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...

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

    Java 反射机制修改私有成员变量实例 Java 反射机制是 Java 语言中一个强大的工具,它允许程序在运行时检查和修改类的结构和行为。在本例中,我们将使用 Java 反射机制来修改私有成员变量的值。 什么是 Java 反射...

    Java方法反射调用demo

    由于私有方法在外部不可见,我们需要使用`getDeclaredMethod`而不是`getMethod`,并且可能需要设置访问权限: ```java Method privateMethod = MyClass.class.getDeclaredMethod("myPrivateMethod"); privateMethod...

    JUnit4利用反射机制测试类的私有成员

    然而,如果私有方法或属性对于类的行为至关重要,那么使用反射进行测试是有意义的。 总结来说,JUnit4结合Java的反射机制可以让我们在必要的时候测试类的私有成员,确保代码的完整性和正确性。但在实际应用中,应...

    C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法

    本篇文章将深入探讨如何使用C#加载DLL,并通过反射来调用其中的公开方法、私有方法以及泛型方法。 首先,我们需要了解什么是DLL(Dynamic Link Library)。DLL是一种可重用的代码库,它包含了一系列可由多个程序...

    Java常用的反射方法

    3.4 获取私有的变量(利用暴力反射) 4. 反射获取构造方法 4.1有参构造 4.2无参构造 4.3无参构造简便写法 5.反射获取成员方法 5.1无参方法 5.2 有参方法 5.3 获取所有方法(包含Object的方法)

    利用java反射机制调用类的私有方法(推荐)

    下面我们将详细讨论如何利用Java反射机制来调用类的私有方法。 首先,我们需要导入相关的Java反射包,包括`java.lang.reflect.Method`和`java.lang.reflect.InvocationTargetException`。接下来,我们创建一个名为`...

    java 反射得到某个方法

    此外,反射可以访问私有成员,这可能会破坏封装性,增加代码的不安全性。 总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取...

    java 反射取得类的私有属性,通过私有属性取得属性值

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和方法,即使这些属性或方法是私有的。这篇博客文章可能讨论了如何利用反射机制来获取类的私有属性并读取其对应...

Global site tag (gtag.js) - Google Analytics