亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Error getMethod(java.lang.String,java.lang.Class

Error getMethod(java.lang.String,java.lang.Class

陪伴而非守候 2022-09-07 17:54:18
我被困在Javassisst。我想將代碼放在位于其他類中的方法中。我有“無方法”例外。當我自己啟動Test2類時,它啟動正常,沒有任何錯誤。我認為Classloader中存在問題,因為我正在嘗試從SUTTest類中調用方法以進行斷言,并且我正在嘗試使用相同的反射(Javassist)與Class1一起使用。也許兩個類加載器相互沖突,我不知道。如何修復此錯誤?Class1 - JavassistClassPool pool = ClassPool.getDefault();CtClass ctAgent = pool.get("Test2");CtMethod method = ctAgent.getDeclaredMethod("runTestSamples");method.insertAfter("targetClass.getMethod(\"setData\", int.class, int.class).invoke(targetInstance, 9, 2);");//  method.insertAt(58, "memoryClassLoader.addDefinition(targetName, instrumented); memoryClassLoader = new MemoryClassLoader();targetClass = memoryClassLoader.loadClass(targetName); targetClass.getMethod(\"setData\", int.class, int.class).invoke(targetInstance, 9, 2);");ctAgent.toClass();new Test2().execute();類 2 - 測試 2import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;import java.util.Map;import org.jacoco.agent.AgentJar;import org.jacoco.core.analysis.Analyzer;import org.jacoco.core.analysis.CoverageBuilder;import org.jacoco.core.analysis.IClassCoverage;import org.jacoco.core.data.ExecutionDataStore;import org.jacoco.core.data.SessionInfoStore;import org.jacoco.core.instr.Instrumenter;import org.jacoco.core.runtime.IRuntime;import org.jacoco.core.runtime.LoggerRuntime;import org.jacoco.core.runtime.RuntimeData;public class Test2 {    private Runnable targetInstance;    public Class<? extends Runnable> targetClass;    private static HashMap<Integer, String> testSamples;    private static HashMap<String, Integer> coverageData;    public String targetName;    public IRuntime runtime;    public Instrumenter instr;    public InputStream original;    public byte[] instrumented;    public RuntimeData data;    public MemoryClassLoader memoryClassLoader;    static Test2 t2 = new Test2();    int a;
查看完整描述

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) };");


查看完整回答
反對 回復 2022-09-07
  • 1 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號