1 回答

TA贡献1998条经验 获得超6个赞
请注意,异常状态
Caused by: compile error: getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class
...
at javassist.CtBehavior.insertAfter(CtBehavior.java:883)
根据java.lang.Class的文档,确实没有具有此类签名的方法,唯一具有名称getMethod的方法具有以下签名:
getMethod(String name, Class<?>... parameterTypes)
引用 http://www.javassist.org/tutorial/tutorial3.html#varargs:
目前,Javassist不直接支持varargs。...
public int length(int... args) { return args.length; }
...要在 Javassist 中嵌入的编译器编译的源代码中调用此方法,必须编写:
length(new int[] { 1, 2, 3 });
而不是使用 varargs 机制调用此方法:
length(1, 2, 3);
类似地,从类java.lang.Method的文档调用方法的签名:
invoke(Object obj, Object... args)
还引用 http://www.javassist.org/tutorial/tutorial3.html#boxing:
Java中的装箱和拆箱是语法上的糖。没有用于装箱或取消装箱的字节码。因此,Javassist的编译器不支持它们。例如,以下语句在 Java 中有效:
Integer i = 3;
因为拳击是隐式执行的。但是,对于 Javassist,您必须将值类型从 int 显式转换为 Integer:
Integer i = new Integer(3);
鉴于上述情况,我认为
method.insertAfter("targetClass.getMethod(\"setData\", int.class, int.class).invoke(targetInstance, 9, 2);");
应更改于
method.insertAfter("targetClass"
+ ".getMethod(\"setData\", new Class[] { int.class, int.class })"
+ ".invoke(targetInstance, new Object[] { new Integer(9), new Integer(2) };");
添加回答
举报