在我正在构建的一个小框架中,我想使用 Javassist 将某些抽象类更改为非抽象类。我已经将所有抽象方法转换为实现我需要的动态生成代码的非抽象方法。但是我还没有成功地使这个类成为非抽象类。我尝试过的与此类似:
假设c
是我想让非抽象的类。所以我写了:
public void instrument(Class c) {
...//some ignored exception management
CtClass ctClass = ClassPool.getDefault().get(c.getName());
ctClass.setModifiers(c.getModifiers() & ~Modifier.ABSTRACT);
return ctClass.toClass().newInstance();
}
但是,调用:
ctClass.toClass();
正在提出以下问题CannotCompileException
:
"attempted duplicate class definition for name: <class_name>."
这是因为该类已经被加载,因为我正在调用它的getName
方法。在我看来,这是我必须CtClass
从现有课程中获得的唯一机制,但请有人告诉我这是否不正确。硬编码类的名称而不是调用它的getName
方法远非一个理想的解决方案,因为我需要将此例程应用于许多类。
任何解决方法可以做到这一点?如果根本不可能,我将动态生成一个扩展抽象类的新类,实现它的构造函数,以及它所有祖先的抽象方法(有点复杂,所以如果我成功制作了原始类非抽象代替)。