Bundle.loadClass()返回没有字段或方法的Class实例

时间:2011-10-12 10:15:44

标签: java osgi classloader equinox apache-felix

我想以编程方式创建一个OSGi框架,用它加载一个Bundle并从该bundle加载一个类。当我调用Bundle.loadClass()时,我得到一个Class isntance,所有字段\ methods \ constructor字段都设置为null。它只有一个名字。我无法访问任何公共方法等。我已经尝试过Equinox和Felix同样的结果。

Bundle的MANIFEST

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Activator: org.osgitest.osgitest.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Name: OSGi Test
Bundle-SymbolicName: org.osgitest.osgitest
Bundle-Version: 1.0
Import-Package: org.osgi.framework
Export-Package: org.osgitest.osgitest.test

框架设置:

FrameworkFactory ff = new EquinoxFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

FrameworkFactory ff = new org.apache.felix.framework.FrameworkFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

捆绑加载:

Bundle testBundle = framework.getBundleContext().installBundle("file:C:\\org-osgitest-osgitest.jar");
testBundle.start();
Class<?> classOne = testBundle.loadClass("org.osgitest.osgitest.test.ClassOne");
Class<?> activator = testBundle.loadClass("org.osgitest.osgitest.Activator");

Activator Class实例包含构造函数引用,但没有公共方法。它有public void start(BundleContext c)public void stop(BundleContext c)

如何加载正确的Class?我究竟做错了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Class使用某种延迟初始化。只有在执行Class之后,getMethods实例才会填充方法/字段。这就是我无法在调试器中看到任何内容的原因。

我尝试调用public static void main(String[] args)但未将String[]投放到Object。所以它被解释为Object[],JVM查找了一个带有签名(args[0].class, args[1].class, ... , args[n].class)的方法。这就是找不到我的方法的原因。

答案 1 :(得分:0)

由于bundle是jar,您是否尝试以正常的-classpath模式加载该类? OSGi只定义了类加载器。 VM仍负责从字节码创建Class对象。所以我没有看到OSGi框架如何从Class对象中“剥离”成员。