繁体   English   中英

Java动态类加载器抛出ClassNotFoundException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM