私が構築している小さなフレームワークで、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
は、理想的な解決策とは言えません。
これを行うための回避策はありますか?. まったく不可能な場合は、抽象クラスを拡張し、そのコンストラクターを実装し、すべての先祖の抽象メソッドを実装する新しいクラスを動的に生成します (もう少し複雑なので、代わりに元のクラス非抽象)。