反射代理 - 类加载器问题的可见性

时间:2011-04-15 10:53:03

标签: java reflection classloader proxy-classes

我正在尝试:
1)从给定文件位置加载接口和实现类
2)使用与接口匹配的反射创建一个Proxy对象,并将所有调用定向到实现类

稍后使用JUnit将其用于测试目的。

问题:
但是,当我尝试创建代理对象时,我似乎遇到了问题。我得到了例外:

java.lang.IllegalArgumentException: interface Testing.Testable is not visible from class loader
...at Core.ProxyFactory.createProxy(ProxyFactory.java:26)

有问题的行如下:

Object obj = Proxy.newProxyInstance(implementationClass.getClassLoader(), new Class[]{interfaceClass}, forwarder);

班级加载方式正确吗?
我正在使用URLClassLoader加载我需要的类。这个片段如下:

URL url = new File(path).toURI().toURL();
URL[] urlList = {url};
// Create loader and load
ClassLoader classLoader = new URLClassLoader(urlList);
Class loadedClass = classLoader.loadClass (classname);
return loadedClass;

但是,这是正确的吗?这个片段会针对每个类文件重复进行,因此我相信每次创建一个新的类加载器。这会导致我的问题吗?我该如何解决这个问题?

提前感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:3)

<强>解决...
我担心我以错误的方式加载类是正确的。因为这些类相互依赖(例如,一个类使用另一个类),所以它们必须属于相同的类加载器,或者属于子类。

可以通过将URLClassLoader替换为:

来解决此问题
ClassLoader classLoader = new URLClassLoader(urlList);
Class[] classes = new Class[classNames.length];
for (int i = 0; i<classNames.length; i++) {
  classes[i] = classLoader.loadClass(classNames[i]);
}

这允许您使用相同的类加载器加载多个类,并且似乎可以解决问题!