OSGi的ClassLoader是一个非常烦人的事情. 这里看到一篇文章, 觉得不错, 意译了一下.
http://olegz.wordpress.com/2008/11/05/osgi-and-classforname/
在osgi中, 除了java.*包下面的类之外, 每一个bundle使用它们自己的classloader来加载所有的类
而osgi的bundle中classloader加载类的过程与一般的classloader有一些区别, 它的加载过程会受到mainfest文件中Import/Export-Package, Required-Bundle 以及其他定义的制约
osgi的classloader有两个职责:
1.加载本bundle下的类(包括相关依赖jar包下的类)
2.按照osgi的规则与其他bundle的classloader协作获取本bundle所需要的class
这里有一个Bundle Class Space的概念, Bundle Class Space = Bundle-Space + Import-Pckage + Import-Bundle etc
可以理解为class范围.
当使用Class.forName()的时候, 需要注意这个要加载的类是否超出了当前Bundle的Class Space
对于Class.forName(”org.bar.Foo”);来说, 必须做到依赖的bundle需要export出org.bar, 而依赖方需要设置bundle的import package 或者require bundle
BTW:To load a class from another bundle use Bundle.loadClass(String) method
分享到:
相关推荐
at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more
at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more
and JSR-291, “Dynamic Component Support for Java,” the latter based on OSGi principles. Knowing that OSGi might very well influence the Java language itself—via Java SE— raised my interest in OSGi...
1. 类的Class对象:每个类都有一个对应的Class对象,通过`Class.forName()`方法可以获取到。例如,`Class<?> clazz = Class.forName("java.lang.String");`。 2. 创建对象:通过Class对象的`newInstance()`方法可以...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................
- `Class.forName(String className)` 是动态加载类的常见方式,它会尝试加载指定名称的类,并返回`Class`对象。如果类尚未加载到JVM中,该方法会调用相应的类加载器进行加载。 4. URLClassLoader: - 当类位于非...
1. **获取类信息**:通过`Class.forName()`方法,我们可以获取到任何已加载类的`Class`对象,从而得到类名、包名、修饰符等信息。 2. **创建对象**:使用`Class.newInstance()`或`Constructor.newInstance()`可以...
`Class.forName()`用于加载类,`Class.newInstance()`创建类的实例,`Method`和`Constructor`类则用于访问和调用类的方法和构造器。 在实际应用中,动态生成、编译和运行Java代码的示例包括: 1. **元编程**:例如...
反射API(如Class.forName())在查找类时也会涉及到ClassLoader。开发者可以指定ClassLoader来加载特定的类,这在处理动态加载或插件系统时非常有用。 8. 源码分析: 阅读ClassLoader的源码可以帮助我们理解其...
Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost/test?user=root&password=1qaz&useUnicode=true&characterEncoding=gbk"; Connection conn = DriverManager.get...
例如,`Class<?> clazz = Class.forName("全限定类名");` 这行代码可以动态获取指定类的Class对象。 3. **反射包** - 主要是指`java.lang.reflect`包,包含了一些核心的反射类,如Class、Constructor、Method和...
首先,使用`Class.forName()`加载类,然后通过`Class`对象的`getDeclaredMethods()`获取类的所有方法,最后使用`Method`对象的`invoke()`方法执行指定的方法。这种方法允许我们在不预先知道具体类和方法名的情况下调...
Class.forName与Class.getClassLoader - **Class.forName**: - 加载指定类,并返回该类的`Class`对象。 - **Class.getClassLoader**: - 返回加载当前类的类加载器。 ### Spring框架 #### 1. Spring机制 - **AOP...
这是通过Java的反射API和Class.forName()方法实现的,可以动态地创建接口实现类的实例。 4. **生命周期管理**:主程序需要管理插件的生命周期,包括初始化、执行、停止和卸载。 **JARCONNECTION可能涉及的方面**: ...
通过`Class`类的`forName()`方法加载类,然后使用`newInstance()`创建对象,或者通过`getMethod()`和`invoke()`执行特定方法。 2. **Java Service Provider Interface (SPI)**: Java SPI是一种用于服务发现和加载...
首先,通过`Class.forName(String className)`获取类的`Class`对象,然后找到静态方法并执行。执行步骤与对象方法基本一致,只是在调用`invoke`方法时,第一个参数传入`null`,因为静态方法不依赖于对象实例。 5. *...
每个类都与一个`Class`对象相对应,可以使用`Class.forName()`方法根据类名获取对应的`Class`对象,或者通过类实例的`getClass()`方法获取。`Class`对象提供了访问类的各种信息,如构造器、方法、字段等。 1. **...
例如,`Class.forName()`用于加载指定类,`Method.invoke()`用于调用对象的方法,这些都在运行时完成,增加了代码的灵活性。 2. **Java代理(Proxy)**: Java代理机制提供了一种创建动态代理类的能力,它可以在...