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

我被困在Javassisst。我想将代码放在位于其他类中的方法中。我有“无方法”例外。当我自己启动Test2类时,它启动正常,没有任何错误。我认为Classloader中存在问题,因为我正在尝试从SUTTest类中调用方法以进行断言,并且我正在尝试使用相同的反射(Javassist)与Class1一起使用。也许两个类加载器相互冲突,我不知道。如何修复此错误?


Class1 - Javassist


ClassPool 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 - 测试 2


import 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;


陪伴而非守候
浏览 217回答 1
1回答

米琪卡哇伊

请注意,异常状态Caused by: compile error: getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class&nbsp; &nbsp; ...&nbsp; &nbsp; 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"&nbsp; + ".getMethod(\"setData\", new Class[] { int.class, int.class })"&nbsp; + ".invoke(targetInstance, new Object[] { new Integer(9), new Integer(2) };");
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java