我在Eclipse中创建了一个Bundle,并在“Overview”选项卡中使用了“Launch the Framework”链接。我在我的bundle中创建了一个接口(TestService),以及应该为它生成代理的代码(在Helper中)。我在Bundle的Activator中调用此代码,然后得到:
Caused by: javassist.NotFoundException: com.test.services.TestService
at javassist.ClassPool.get(ClassPool.java:436)
at com.test.services.Helper.get(Helper.java:46)
它向右抛出第一个ClassPool.get():
ClassPool pool = ClassPool.getDefault();
CtClass result = pool.get(TestService.class.getName());
...
TestService是公共的,在同一个包中,而Bundle是Helper,它生成Exception。显然,仅仅执行“ClassPool.getDefault()”并不够好。那么我需要做什么才能使ClassPool看到Bundle中的类?我是否必须导入自己的包裹?
答案 0 :(得分:10)
如果“source”是由OSGi bundle类加载器加载的对象,则可以将相应的“classpath”(或类加载器)添加到ClassPool中,如下所示:
pool.insertClassPath(new ClassClassPath(source.getClass()));
或在您的情况下只是
pool.insertClassPath(new ClassClassPath(TestService.class));
希望它有所帮助。
答案 1 :(得分:2)
我在一些OSGi包中使用javassist来动态修改/生成Java类。你可以看看here。希望它可以帮到你。