反射invoke()方法

invoke()方法:

    主要是为了类反射,可以在不知道具体类的情况下,根据配置字符串去调用一个类的方法。最简单的方法是可以把方法参数化。

 

   main.invoke():
    比如Test类里有一系列名字相似的方法setValue1、setValue2等,可以把方法名存进数组v[],然后循环里invoke(test, v[i]),就顺序调用了全部的setValue()方法。


    JAVA的反射是指,可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例,通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法。

import java.lang.reflect.*;

public class Reflect {
	public static void main(String[] args){
		try {
			Class c = Class.forName("java.util.HashSet");			
			Object o = c.newInstance();
			Method[] methods = c.getDeclaredMethods();
			for(Method method : methods){
				System.out.println(method);
			}
			Method m1 = c.getMethod("add", Object.class);
			m1.invoke(o, "cyq");
			m1.invoke(o, "hello");
			m1.invoke(o, "java");
			System.out.println(o);
		} catch (Exception e) {			
			e.printStackTrace();
		} 
		
		
	}

}

这是一个简单的反射例子,就是得到HashSet中的所有申明的方法,生成一个HashSet的实例,然后往里面添加对象 。


Java中的反射机制允许运行时获取类的信息以及操作对象实例,而`reflect.invoke()`是一个通过反射直接调用目标方法的功能。 ### Java Reflect 的 `invoke()` 方法简介 `invoke()` 方法是 `java.lang.reflect.Method` 类的一个静态方法,在 `Method` 对象上调用此方法可以动态地调用该方法所代表的类或接口的方法。这个功能非常强大,可以在运行时决定要调用的方法名称、参数及其返回值类型,并传递给实际的对象。 #### 参数说明: 1. **第一个参数** - 要调用方法的实例对象 (`Object instance`)。 2. **第二个参数** - 方法所需的参数列表 (`Object[] args`)。数组中的每个元素对应于方法声明中的一个参数。 3. **第三个参数** - 可选的标志位,用于控制如何处理方法调用的异常 (`boolean throwException`)。默认为 `false` 表示忽略异常并抛出 `IllegalAccessException`;设置为 `true` 则会抛出任何捕获到的异常。 ### 使用例子 假设我们有一个简单的类 `ExampleClass`: ```java public class ExampleClass { public void exampleMethod(int x) { System.out.println("Received value: " + x); } } ``` 然后我们需要通过反射调用其 `exampleMethod` 方法: ```java import java.lang.reflect.Method; class ReflectionDemo { public static void main(String[] args) throws Exception { Class<?> clazz = ExampleClass.class; Method method = clazz.getMethod("exampleMethod", int.class); // 创建 ExampleClass 的实例 ExampleClass exampleInstance = new ExampleClass(); // 获取 Method 实例并调用它 Object result = method.invoke(exampleInstance, 42); // 输出结果 (尽管实际上这里的结果并没有被存储在变量里) System.out.println("Invoke result is: " + result); } } ``` 在这个例子中,`getMethod("exampleMethod", int.class)` 获取了 `exampleMethod` 方法的 `Method` 实例,并通过 `invoke` 方法调用了它,传入了一个整数作为参数。 ### 相关问题: 1. **反射和运行时灵活性之间的关系是什么?** 反射提供了一种在运行时查看和操纵类信息的能力,这极大地增加了程序的运行时灵活性,包括动态加载类、检查类属性和方法等。 2. **何时不应该使用反射?** 尽管反射功能强大,但在需要高效性能的场合下(如大规模数据处理或高并发应用),过度使用反射可能会导致性能下降。反射涉及到对字节码的解析和解释过程,相比于直接的指令执行,它的效率较低。 3. **如何优化使用反射以提高性能?** 尽量避免频繁使用反射,特别是在循环内或者需要大量调用的地方。考虑将反射的操作封装在初始化阶段完成,例如在构造函数或静态初始化块中预先获取所需的信息,而不是每次方法调用时都依赖反射。同时,使用原始类型而非包装类可以减少不必要的创建和销毁操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值