我正在尝试以下 wrt Refleciton,让我知道这是否可能
public class A {
void start(){
execute();
}
}
public class B extends A {
void execute()
{
doWork();
}
public abstract void doWork();
}
我将上述类打包在一个 jar 中,并让它在 JVM 上运行。现在我试图在运行时创建另一个类,在运行时编译它并尝试使用反射来调用 B 类的执行函数()。
public class C extends B {
@Override
public void doWork()
{
//Implementation
}
}
反射代码:
Classloader = 应用程序 jar 的 url 和 C.class 的 url,在运行时编译。父加载器 - Thread.currentThread().getContextClassLoader() 我还将当前线程的上下文类加载器设置为上面创建的类加载器。
Class<? extends B> cls = (Class<? extends B>) Class.forName("className", true, clsLoader);
Object obj = cls.newInstance();
Method method = obj.getClass().getSuperclass().getMethod("start", new Class[0]);
method.invoke(obj, new Object[0]);
我能够获得该方法并且调用也被调用。但是,当调用 B 类的执行时,它试图调用 doWork(),然后我遇到了 AbstractMethodError。在查看异常时,我发现异常发生在不正确的类加载器/jar 中。但我不确定如何解决我的情况。
有人可以帮忙吗?