利用反射动态调用类成员
使用反射来调用类的方法,需要使用Java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一个参数是指需要调用的那个方法的隐式参数,也即那个方法所属的对象,假如调用的是一个静态方法将第一个参数指定为null,第二个参数是指需要调用的那个方法的显式参数,因为一个方法可以有很多个参数所以在这里我们必须用一个数组来存放这些参数,注重这个方法使用的是对象数组,在存放时尽管有值类型我们也要把相应的包装器类存放进去,当调用的这个方法有返回值,这在Java中是一个令人烦恼的问题,假如返回来的是一个对象还好,我们只需将invoke返回的Object强制转换成特定的对象就可以,可是返回一个值类型呢?我们要使用就麻烦了,首先要对其解包装,在用其包装对象的方法返回普通值!我们编程思路很重要是吧!
编程的基本思路:
首先获得需要被调用的方法的指针,其实说指针不是那么好理解,而java的方法指针也一度的引起很大的争论,我们干脆叫引用吧!怎么获的引用呢?可使用Class类的getMethod方法该方法返回一个Method,接着我们在使用Method的invoke方法调用这个引用所指向的方法,就这么简单,我一直认为用一个简单的例子讲诉一个复杂的概念是最注重实效的!(在JDK1.4下调试通过)
import java.lang.reflect.Method;
public class InvokeMethods {
public static void main(String[] args) {
Employee emp = new Employee();
// /getClass获得emp对象所属的类型的对象,Class就是类的类
// /Class是专门用来描述类的类,比如描述某个类有那些字段,
// /方法,构造器等等!
Class cl = emp.getClass();
try {
// /getMethod方法第一个参数指定一个需要调用的方法名称
// /这里是Employee类的setAge方法,第二个参数是需要调用
// /方法的参数类型列表,是参数类型!如无参数可以指定null
// /该方法返回一个方法对象
Method sAge = cl.getMethod("setAge", new Class[] { int.class });
Method gAge = cl.getMethod("getAge", null);
Method pName = cl.getMethod("printName", new Class[] { String.class });
/**
* *使用invoke调用指定的方法
*/
Object[] args1 = { new Integer(25) };// 参数列表
// emp为隐式参数该方法不是静态方法必须指定
sAge.invoke(emp, args1);
Integer AGE = (Integer) gAge.invoke(emp, null);
int age = AGE.intValue();
System.out.println("The Employee Age is: " + age);
Object[] args3 = { new String("Jack") };
pName.invoke(emp, args3);
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
class Employee {
// 定义一个员工类
public Employee() {
age = 0;
name = null;
}
// 将要被调用的方法
public void setAge(int a) {
age = a;
}
// 将要被调用的方法
public int getAge() {
return age;
}
// 将要被调用的方法
public void printName(String n) {
name = n;
System.out.println("The Employee Name is: " + name);
}
private int age;
private String name;
}
分享到:
相关推荐
C#高级开发的工具,提高编程效率的利器,提升编程水平的必由之路
综上所述,利用反射动态调用DLL方法是一项灵活但需要注意效率的技术,它使得我们的代码能够根据运行时的条件执行不同的功能,大大提高了代码的可扩展性和适应性。在实际项目中,如“WcfCallClient.sln”和...
本文将围绕C#中的反射机制展开,详细讨论其在动态编译代码、创建类实例和调用成员方面的应用,并通过具体示例来加深理解。 首先,我们需要了解反射机制在.NET中扮演的角色。反射为.NET应用程序提供了一种机制,使得...
本篇文章将深入探讨如何利用反射在C#中动态创建对象。 1. **反射基础** 反射是.NET框架提供的一种特性,通过System.Reflection命名空间中的类来实现。主要类包括Assembly(程序集)、Type(类型)、...
它允许我们动态地获取类的信息并对其进行操作,包括访问私有成员。要实现这一点,我们可以使用`java.lang.reflect`包中的`Class`、`Field`和`Method`类。 在给定的例子中,有一个`Commodity_Parent`类,它包含私有...
尽管可以利用反射访问私有成员,但这应被视为一种特殊情况下的权宜之计,而不是常规编程实践。在单元测试中,适度使用反射可以帮助验证私有方法的行为,但也要注意保持测试的独立性和稳定性。在设计和实现代码时,应...
在编程领域,动态调用类模块是一个重要的概念,特别是在面向对象编程中。它允许程序在运行时决定要调用哪个类或方法,而不是在编译时就固定下来。这种技术通常与反射、元编程和插件系统相关联,极大地提高了代码的...
一旦我们有了`Class`对象,我们就可以利用反射来创建对象,调用方法和访问属性。例如,我们可以使用`newInstance()`方法创建一个新对象,但前提是没有参数的构造函数: ```java Person person = (Person) person...
在这个场景中,我们将讨论如何利用反射来动态调用计算器对象的加法和减法函数,以及如何修改一个学生对象的私有数据成员。 首先,让我们深入理解Java反射机制。在Java中,`java.lang.Class`类是所有类的通用表示,...
本文将深入探讨如何利用反射技术动态加载DLL文件,以及这一过程中的关键知识点。 首先,我们要了解什么是DLL。DLL(Dynamic Link Library)是Windows操作系统中的一个共享库,包含了一组可执行代码和数据,可供多个...
在给定的场景中,我们利用反射机制实现了动态调用计算器的加法和减法函数,并修改了学生对象的私有数据成员。下面将详细讲解这些知识点。 首先,让我们关注`Calculator`类中的加法和减法函数。假设`Calculator`类有...
在本例中,我们将讨论如何利用反射动态加载DLL文件,并结合SQL Server数据库来实现这一功能。 首先,我们需要理解动态加载DLL的基本概念。在传统的编程模式中,DLL(动态链接库)是在编译时静态链接到应用程序中的...
Java动态调用方法是Java反射机制的一个重要应用,它允许我们在程序运行时,根据需要动态地获取类的信息并调用其方法。这种能力为代码的灵活性和可扩展性...在实际使用中,应结合具体需求权衡利弊,合理利用反射功能。
本篇将深入探讨如何利用反射动态加载和卸载DLL,以及在实际应用中的场景。 首先,我们需要了解DLL(动态链接库)在Windows操作系统中的作用。DLL文件是一组可重用的函数和数据,多个应用程序可以共享它们,以减少...
在上述代码示例中,我们看到了如何利用反射来动态加载类并执行特定方法。以下是关于Java反射机制的详细解释以及代码分析: 1. **Java反射机制**:Java反射API包含在`java.lang.reflect`包中,主要类有`Class`、`...
4. **反射调用的步骤**: - 获取类的`Class`对象:`Class<?> t_class = Class.forName(className);` - 获取指定方法:`Method method = t_class.getDeclaredMethod(methodName, HttpServletRequest.class, ...
在本篇文章中,我们将深入探讨如何利用C#中的反射机制来访问类中的私有变量或方法。通过一个具体的示例代码,我们将详细了解反射的基本概念、使用场景以及如何具体操作。 ### 一、C#反射机制简介 #### 1.1 什么是...
利用反射动态调用类成员** 反射允许程序在运行时动态获取类型信息并调用其成员。例如,使用`Type`类的`GetMethod`方法获取方法信息,然后使用`Invoke`方法调用该方法。 **29. 利用泛型与反射简化抽象工厂** 结合...
在.NET框架中,C#语言提供了强大的反射机制,允许程序在运行时检查自身,并能动态地创建对象和调用成员。本主题将深入探讨如何利用C#的反射特性来动态调用DLL(动态链接库)中的方法。首先,我们需要了解什么是DLL...