gpt4 book ai didi

java - 类加载器之间的反射参数类型不匹配

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:29 25 4
gpt4 key购买 nike

为了向后兼容性测试,我正在创建自己的类加载器来加载我以前版本的一些代码。在我拥有我的自定义对象(来自旧的自定义类)之后,我正在使用反射调用它的 API。但是,当此类 API 方法具有自定义参数(不是 java 库的一部分)时,例如:

public void MyMethod(MyObj a) {}

当我使用反射调用此方法时,我得到:

java.lang.IllegalArgumentException: argument type mismatch

因为我从默认类加载器传递 MyObj,而该方法期望从自定义类加载器获取 MyObj。

我用来调用该方法的代码(代理由我的自定义类加载器加载,代理的 api 方法的参数来 self 的测试类,该测试类由默认类加载器加载)

        private Object invoke(Object... args) {
try {
final String methodName = getMethodName();
final Class<?>[] methodArgs = getMethodArgs(methodName);
return agent.getClass().getMethod(methodName, methodArgs).invoke(agent, args);

} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}

private Class<?>[] getMethodArgs(String methodName) {
final Method[] declaredMethods = agent.getClass().getDeclaredMethods();
for (Method method : declaredMethods) {
if (method.getName().equals(methodName)) {
return method.getParameterTypes();
}
}
return new Class<?>[0];
}

private String getMethodName() {
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[3];
return e.getMethodName();
}

我该如何解决这个问题?(我无法将公共(public)接口(interface)传递给该方法,因为 myCustomObject 没有实现共享模块中存在的接口(interface),而且我现在无法添加一个,因为旧的 jars 不知道它)

最佳答案

您可以使用自定义类加载器加载扩展 MyObj 的类“DefaultCtorMyObjWrapper”(由自定义类加载器加载)。DefaultCtorMyObjWrapper 包装了一个由默认构造函数加载的“MyObj”实例(引用应保留为对象)。DefaultCtorMyObjWrapper 覆盖 MyObj 的所有方法,并使用反射将调用委托(delegate)给包装的 MyObj。

应该看起来像这样:

class DefaultCtorMyObjWrapper{

Object _defaultCtorMyObj;

public DefaultCtorMyObjWrapper(Object defaultCtorMyObj){
_defaultCtorMyObj = defaultCtorMyObj;
}

public method1(){
// invoke method1 on _defaultCtorMyObj using reflcetion
}

}

如果 MyObj 的方法接收对象作为参数,您可能需要进行更多调整。

关于java - 类加载器之间的反射参数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com