使用特定的ClassLoader获取CtClass

问题描述 投票:1回答:1

我有这样的类结构:

package com.mydomain.myproject;
public class Outer{
    public class Inner{
        //some code
    }
}

现在,我可以使用以下方法获得内部类的CtClass

ClassPool pool=ClassPool.getDefault();
CtClass innerCt=pool.getCtClass("com.mydomain.myproject.Outer$Inner");

如果这些类由特殊的ClassLoader加载,则会出现问题。

[ClassPool#getCtClass失败,因为它使用的ClassLoader不知道该类。

我收到以下异常:

javassist.NotFoundException: io.github.jdiscordbots.nightdream.commands.Eval$Sandbox
    at javassist.ClassPool.get(ClassPool.java:430)
    at javassist.ClassPool.getCtClass(ClassPool.java:495)
    at <my classes>

如何为ClassLoader指定ClassPool#getCtClass?我可以以某种方式设置ClassPool的类加载器吗?我注意到有一个getClassLoader()方法,但似乎没有设置方法。

java classloader javassist bytecode-manipulation dynamic-class-loaders
1个回答
1
投票

ClassPool支持插入,附加和删除ClassPath。可以以String或ClassPath实现的形式插入和添加ClassPath。仅以ClassPath的形式支持删除。

提供了4种ClassPath实现:

  1. ByteArrayClassPath:提供字节码和类名
  2. ClassClassPath:提供Java类
  3. LoaderClassPath:提供一个类加载器
  4. URLClassPath:提供URL
© www.soinside.com 2019 - 2024. All rights reserved.