ReflectiveMethodInvocation invocation = new ReflectiveMethodInvocation( proxy, target, Target.class.getMethod("foo", int.class), new Object[]{100}, Target.class, interceptorList ){}; 为什么这样写,就可以创建ReflectiveMethodInvocation的对象?
时间: 2024-04-03 11:37:15 浏览: 244
这段代码使用了Java中的匿名内部类语法创建了一个ReflectiveMethodInvocation对象,并对其进行了初始化。具体来说,代码中的{}表示一个匿名内部类的开始,该匿名内部类继承了ReflectiveMethodInvocation类并重写了其中的构造方法。在这个匿名内部类中,调用了ReflectiveMethodInvocation类的构造方法,传入了proxy、target、目标方法(即Target类中的foo方法)、参数(即100)、目标类(即Target.class)和拦截器列表(即interceptorList)等参数,从而创建了ReflectiveMethodInvocation的对象。
需要注意的是,这里传入的参数都是对应构造方法中的参数,通过这些参数可以对ReflectiveMethodInvocation的对象进行初始化和赋值。其中proxy指代的是代理对象,target指代的是目标对象,interceptorList指代的是方法拦截器列表,而getMethod方法是获取Target类中的foo方法并将其作为ReflectiveMethodInvocation的目标方法。
相关问题
package step4; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Reflect_stu { public static void main(String[] args) throws InvocationTargetException { //使用反射调用 Class clazz = null; try { clazz = Class.forName("step4.Apple"); /********** Begin *********/ Method setPriceMethod = clazz.getMethod("setPrice", double.class); Constructor appleConstructor = clazz.getConstructor(); Object apple = appleConstructor.newInstance(); setPriceMethod.invoke(apple, 14); Method getPriceMethod = clazz.getMethod("getPrice"); System.out.println(getPriceMethod.invoke(apple)); Method getTotal = clazz.getMethod("getTotal", double.class, int.class); System.out.println(getTotal.invoke(apple, 20, 24)); /********** End *********/ } catch (Exception e) { e.printStackTrace(); } } } class Apple { private double price; private int count; public Apple() { } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public double getTotal(double price, int count) { return price * count; } }
这段代码是一个使用反射调用的示例,它包括一个主类 Reflect_stu 和一个 Apple 类。在主类中,首先使用 Class.forName 方法获取 Apple 类的 Class 对象,然后使用 getMethod 方法获取 Apple 类中的 setPrice、getPrice 和 getTotal 方法,并使用 getConstructor 方法获取 Apple 类的默认构造方法的 Constructor 对象。接着使用 newInstance 方法创建一个 Apple 对象,并使用 invoke 方法调用 setPrice 方法设置 Apple 对象的价格为 14,使用 invoke 方法调用 getPrice 方法获取 Apple 对象的价格并输出,最后使用 invoke 方法调用 getTotal 方法计算 Apple 对象的总价并输出。
请帮忙检查一下代码中的错误:package com.enmo.mdi.distributedcomputing.distributed; import java.util.function.Function; import java.lang.reflect.*; public class Algorithm { public Algorithm() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { } private Double sum(Double... args) { Double num = 0.0; for (Double d: args){ num += d; } return num; } private String add(String... args) { StringBuilder str = new StringBuilder(); for (String s: args){ str.append(s); } return str.toString(); } public static Object callMethod(String name, Object... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class<?> clazz = Class.forName("com.enmo.mdi.distributedcomputing.distributed.Algorithm"); // 获取方法的Method对象 Method method = clazz.getDeclaredMethod(name, Double.class); method.setAccessible(true); // 调用该方法 return method.invoke(null,args); } public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { // sum Double result = (Double) callMethod("sum", 1,2,3,4,5); System.out.println(result); String result1 = (String) callMethod("add", "1", "2", '3'); System.out.println(result1); } }
代码中的问题是:
1. 在调用callMethod()方法时,传入的参数类型不匹配,应该将数字1,2,3,4,5修改为1.0,2.0,3.0,4.0,5.0,即将整型转换为浮点型。对于字符串"3",应该将其改为字符'3'。
2. 在调用callMethod()方法时,获取方法的Method对象时,应该使用Double[].class和String[].class而不是Double.class和String.class,因为参数是可变的数组。
修改后的代码如下:
```java
package com.enmo.mdi.distributedcomputing.distributed;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Algorithm {
public Algorithm() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
}
private Double sum(Double... args) {
Double num = 0.0;
for (Double d: args){
num += d;
}
return num;
}
private String add(String... args) {
StringBuilder str = new StringBuilder();
for (String s: args){
str.append(s);
}
return str.toString();
}
public static Object callMethod(String name, Object... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = Class.forName("com.enmo.mdi.distributedcomputing.distributed.Algorithm");
// 获取方法的Method对象
Method method = clazz.getDeclaredMethod(name, Double[].class);
method.setAccessible(true);
// 调用该方法
return method.invoke(null, (Object) args);
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// sum
Double result = (Double) callMethod("sum", 1.0, 2.0, 3.0, 4.0, 5.0);
System.out.println(result);
String result1 = (String) callMethod("add", "1", "2", "3");
System.out.println(result1);
}
}
```
阅读全文