[英]Java Dynamic classloader throws ClassNotFoundException
我有一个具有自己的类加载器的项目。 但是加载某些类时遇到一个奇怪的问题。
基本上,它就像:
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
// do some magic
return myBrandNewClas;
}
但是发生的事情是,即使返回一个类, Class.forName(...)仍然会抛出ClassNotFoundException (可以在此处找到示例)。
另一个信息:返回的类的名称与请求的类名称不同。
我开始怀疑它是否是JVM的安全锁(已在Oracle JVM中测试)。
谢谢!
forName的代码是本地代码,因此很难看到,但是是的,我想说一下该名称已被检查,因为传递正确的名称是可行的:
public class BBB
{
public static class a {
}
private static class MyCL extends ClassLoader
{
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
System.out.println("Hi, " + a.class.getName());
return a.class;
}
}
public static void main(String[] args) throws ClassNotFoundException
{
MyCL cl = new MyCL();
System.out.println(Class.forName("com.asg.util.BBB$a", true, cl));
}
我可以通过将类重命名为所需的类名称来解决该问题。
import javassist.ClassPool;
import javassist.CtClass;
public class AAA
{
public static class B
{
@Override
public String toString()
{
return "B";
}
}
private static class X extends ClassLoader
{
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
try
{
if ("A".equals(name))
{
ClassPool cp = ClassPool.getDefault();
CtClass clazz = cp.get("AAA$B");
clazz.setName("A");
return clazz.toClass();
}
return super.loadClass(name, resolve);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) throws Exception
{
X x = new X();
System.out.println(Class.forName("A", true, x).newInstance().toString());
}
}
到目前为止,这很好。 现在,我将这段代码放入我的项目中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.