JavassistのがCtMethod.makeのcom.company.testにNULLポインタを投げているOSGIを使用する活性化剤およびジョーJavassistのが
public class Activator implements BundleActivator {
public Class<?> creerClasse() {
CtClass toGenerateClass;
ClassPool pool;
pool = ClassPool.getDefault();
try {
Class c;
c = Class.forName("com.company.test.Joe");
pool.appendClassPath(new ClassClassPath(c));
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
pool.importPackage("com.company.test");
toGenerateClass = pool.makeClass("Test118");
try {
toGenerateClass
.addMethod(CtMethod
.make("public void afficher (com.company.test.Joe msg) { System.out.println(msg); } ;",
toGenerateClass));
} catch (CannotCompileException e) {
e.printStackTrace();
}
try {
return toGenerateClass.toClass();
} catch (CannotCompileException e) {
e.printStackTrace();
return null;
}
}
public void start(BundleContext context) throws Exception {
Class<?> genClass = creerClasse();
Class<?> c = Class.forName("com.company.test.Joe");
for (Method me : genClass.getDeclaredMethods()) { // test print, ok
System.out.println(me);
}
Method method = genClass.getDeclaredMethod("afficher", c);
Joe person = new Joe();
person.setId(17);
method.invoke(genClass.newInstance(), person);
}
}
iはinstansiateのパッケージでCtMethod.makeとgetDeclaredMethodでNOTFOUND /ヌルポインタをスロープール付きプール=新しいClassPool(true)。 は、それがスローます。java.lang.NoClassDefFoundError:COM /会社/テスト/ジョー・getDeclaredMethod
ありがとうございました。 私は実際に別のバンドルで別のクラスを使用しているクラス 'A'を実際に動的に生成したいとします。この場合は' com.company.test.Joe' このクラスは 'A'クラスのmethodeのパラメータになります'A'のインスタンスを作成してメソッドを呼び出します。 マニフェストに 'Import-Package'、' DynamicImport-Package'と他のバンドルの 'dependency'も追加しました。また、' com.company.test.Joe'を含むパッケージを他のバンドルからエクスポートしました –