`

使用反射对类的私有方法和属性进行调用

阅读更多
   公司不忙,没事可做,springMVC没有调试成功,很郁闷。只好沿着没有学习完毕的反射继续学习,本以为使用反射获取到类的方法后,直接使用invoke方法调用就可以了,没想到中间也出现了一个小插曲。
   关于JDK的反射涉及到的包和类在前面两篇博客上已经写了,这里就不再叙述。下面进入学习,在复习下通过反射调用特定Class的方法的流程:
   1. 获取Class类型Class cls = 类名.class
   2. 根据方法名和形参类型来获取相应的方法,Method method = cls.getDeclaredMethod(methodName, new Class[]{}),以此类比,属性的获取为Field field = cls.getDeclaredField(fieldName)
   3. 因为获取的方法和属性有private修饰符修饰,故不能直接对其调用或修改,需要分别对该方法和属性取消java访问范围检查setAccessible(true)
   4. 获取对应Class的实例,Object instance = cls,newInstance();
   5. 使用field.set(instance, value)给对应实例的属性赋值,
      调用method.invoke(instance, params)方法
   6. 打印出属性值和方法运行结果。

测试需要的条件类:Person.java
package com.reflect.pojo;

/**
* 测试条件(反射)
* @author xiaoyun 2013-07-17
*/
public class Person {
private String name;
private String age;
private String height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}

private int add(int a, int b) {
return a + b;
}

private String echo(String msg) {
return msg;
}
}
反射测试类:
ReflectDemo.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.reflect.pojo.Person;

/**
* 使用反射调用类的私有方法,改变私有变量值(不使用set方法)
*
* @author xiaoyun 2013-07-17
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception{
//获取该类
Class cls = Person.class;
//获取该类的一个实例
Object instance = cls.newInstance();
//根据方法名和形参类型获取特定的方法
Method addMethod = cls.getDeclaredMethod("add", new Class[]{int.class, int.class});
//取消Java语言访问范围检查(这样就可以执行对应Class的add方法了)
addMethod.setAccessible(true);
//根据参数名获取类属性
Field nameField = cls.getDeclaredField("name");
//这样就可以对name属性进行赋值了
nameField.setAccessible(true);
nameField.set(instance, "xiaoyun");
Method getNameMethod = cls.getDeclaredMethod("getName", null);
System.out.println("被赋值后的name为:" + getNameMethod.invoke(instance, null));
Object result = addMethod.invoke(instance, new Object[]{1, 2});
//强转成Integer或者直接答应出结果都可以
System.out.println("add方法执行结果为:" + result + "," + (Integer)result);
}
}
    程序可以直接运行,没有问题。JDK版本为1.6.这次的知识点主要是访问私有方法和修改私有属性需要使用setAccessible方法设置下。好,下次将探索估计会在这周末。
    晚上回去研究下springMVC,感觉今天那个人写的Demo确实不怎么好,不太适合初学者,跑不通,代码也不完整,我表示很气愤,这浪费了我将近两个半小时的时间,真是气死了。
 
0
2
分享到:
评论
1 楼 飞翔神话 2013-07-18  
顶下楼主,希望进一步发表

相关推荐

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

    总结起来,Java反射为我们提供了在运行时操作类、方法和属性的强大工具,包括调用私有方法和获取私有属性值。然而,它也是一把双刃剑,使用时需权衡利弊,确保代码的稳定性和安全性。在处理私有成员时,务必注意对...

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

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java程序具有了高度的灵活性和动态性,尤其在框架开发、插件系统...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

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

    这篇博客文章可能讨论了如何利用反射机制来获取类的私有属性并读取其对应的属性值。以下是关于这个主题的详细解释。 首先,我们需要理解什么是反射。Java反射API提供了一系列类和接口,如`Class`、`Field`、`Method...

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

    `Test`类中的`Main`方法则演示了如何使用反射来修改`ChangeValue`类实例中的私有变量。 - **获取类型**:使用`GetType()`方法获取`ChangeValue`对象的类型信息。 - **获取私有字段信息**:通过`GetField`方法,并...

    反射获取属性调用方法反射获取属性调用方法

    - `TestReflect`可能是一个测试类,用于演示如何使用反射获取属性和调用方法。 以上就是反射获取属性和调用方法的基本概念、实现方式以及相关应用场景。掌握反射技术,能让你在编程中更加灵活,解决许多设计难题。

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

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

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

    然而,对于类的私有成员(包括私有方法和私有属性),由于其封装性,通常不易直接进行测试。但实际情况中,私有成员可能对类的行为产生关键影响,因此测试它们也是必要的。本文将介绍如何使用JUnit4结合Java的反射...

    java 反射入门-属性方法调用实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括类的方法、字段、构造器等信息。这篇博文将带你...

    frida反射调用对象中的方法与字段.pdf

    本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...

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

    这一机制的核心在于,Java程序可以获取到关于任何类的内部信息,包括类名、属性、方法、构造器等,并能在运行时创建和调用对象。这种能力使得Java具有了很高的灵活性和可扩展性,尤其是在处理动态加载类、框架设计...

    反射,动态加载指定类调用类中的方法

    在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class<?>`: 这是所有Java类的通用表示,通过`Class....

    获取封装类的私有属性

    在编程领域,尤其是在面向对象编程(OOP)中,封装是核心概念之一。...通过提供公共的getter和setter方法,或者使用`property`装饰器,可以更好地控制对私有属性的访问,同时保持代码的清晰性和可维护性。

    java反射,获取所有属性、方法以及List集合类

    在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类信息等。本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解...

    用反射的方式获取父类中的所有属性和方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。本文将深入探讨如何使用反射来获取父类中的所有属性和方法,这对于理解和调试...

    运用反射得到类中的属性和值

    在Java编程语言中,反射是一种强大的机制,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地调用方法或修改字段值。本文将深入探讨如何通过反射来获取一个类中的所有属性及其对应的值,从而更好地...

    java反射获取所有属性,获取所有get方法,包括子类父类

    在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...

    易语言取类方法(调用未公开方法)

    这通常涉及到对内存操作的理解和使用,因为未公开方法的调用可能需要直接操作对象的内存地址来触发执行。这需要开发者具备一定的底层知识,包括但不限于内存管理、指针操作和API调用等。 资源作者@woxl提供的资源...

    编写Student类,类中包含学生姓名,学号等私有数据成员。使用JAVA反射机制修改一个学生对象的私有数据成员

    编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)

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

    在上面的代码中,我们首先获取了 SimpleBean 类的私有属性 beanName,然后调用其 setAccessible(true) 方法来关闭安全检测。这样,我们就可以获取私有属性的值。 然而,需要注意的是,Java 反射机制获取私有构造...

Global site tag (gtag.js) - Google Analytics