如何在OSGi Bundle中创建/初始化Javassist ClassPool?

时间:2011-09-19 13:22:34

标签: classpath osgi

我在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中的类?我是否必须导入自己的包裹?

2 个答案:

答案 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。希望它可以帮到你。