javassist中的CtClass对象的toClass做了什么?

发布于 2022-09-02 14:35:07 字数 1904 浏览 26 评论 0

public class MyClassLoader extends WebappClassLoader{
    public MyClassLoader(){
        System.out.println("无参构造");
    }
    
    public MyClassLoader(ClassLoader parent){
        super(parent);
        System.out.println();
        System.out.println("当前现成的加载器"+Thread.currentThread().getContextClassLoader());
        System.out.println(getParent());
        
    }
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
    
        Class<?> clazz=null;
        clazz=findLoadedClass(name);
        if(clazz==null){
            if(name.contains("com.yyd")){
                clazz=loadbyme(name);
            }else{
                clazz=super.loadClass(name);
            }
        }
        return clazz;

    }

    private Class<?> loadbyme(String name) throws ClassNotFoundException{
        ClassPool pool=ClassPool.getDefault();
        CtClass ctclass=null;
        Class<?> clazz=null;
        
        //这个clazz2就是用来实验的,没用
        CtClass ctclass2=null;
        Class<?> clazz2=null;
        
        try {
            pool.insertClassPath("E:\\***\\WEB-INF\\classes");
            ctclass = pool.get(name);
            ctclass2 = pool.get(name);
        //下面这个try-catch块按理说没起什么作用,但是去掉就不报错,加上就报错    
            try {
                clazz2=ctclass2.toClass();
                System.out.println(name+"------------->"+clazz2);
                
            } catch (CannotCompileException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (NotFoundException e) {
            System.err.println("********NotFoundException---------》"+name);
            clazz=super.loadClass(name);
        }
        
        clazz=super.loadClass(name);

        return clazz;    
    }
}




代码中写有注释的那个try-catch块,ctclass2.toClass()的底层是做了什么操作?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

2022-09-09 14:35:07

如果加上 try-catch 报错的话,那说明代码根本没有 throws CannotCompileException

表情可笑 2022-09-09 14:35:07

会先调用CtClass对象对应的ClassPool对象的toClass()

public Class toClass() throws CannotCompileException {
        return this.getClassPool().toClass(this);
}

再来看看ClassPool对象的toClass()

public Class toClass(CtClass clazz) throws CannotCompileException {
        return this.toClass(clazz, this.getClassLoader());
}

其实就是调用这个ClassPool对象的类加载器把这个CtClass对应的字节码加载到JVM里来

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文