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) };");
添加回答
舉報