2011-10-12 30 views
1

我想以编程方式创建一个OSGi框架,使用它加载一个Bundle并从该Bundle中加载一个类。当我打电话给Bundle.loadClass()时,我得到一个Class,其中所有fields \ methods \ constructor字段都设为null。它只有一个名字。我无法访问任何公共方法等。我已经尝试了Equinox和Felix,结果相同。Bundle.loadClass()返回没有字段或方法的类实例

捆绑的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"); 

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

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

回答

1

Class使用某种懒惰初始化。 Class实例只有在执行getMethods后才会填写方法/字段。这就是为什么我无法在调试器中看到任何东西。

我试图调用public static void main(String[] args),并没有将我的String[]转换为Object。所以它被解释为像Object[]和JVM寻找签名为(args[0].class, args[1].class, ... , args[n].class)的方法。这就是为什么我的方法没有找到。

0

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

相关问题