我目前在处理我正在进行的一个小项目时遇到了问题。在这个项目中,我尝试从配置String动态创建类并将其加载到JVM中。
当我在"正常"环境(单元测试)一切正常。但是当我尝试在OSGI环境(Apache Karaf)中创建类时,我收到一个ClassFormatError,其中包含Message" Illegal class name" Ljava / lang / String;"在课堂上......"。
经过一个简短的研究后,我发现当java / lang中的类没有被系统类加载器加载时会出现这个问题,但是当我在Java中加载类时,除了专家之外我还有其他的东西。特别是OSGi。
我认为我访问defineClass
方法的方式可能会对此问题感兴趣,所以这里是:
PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return RestEndpoint.class.getProtectionDomain();
}
});
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
Class loader = Class.forName("java.lang.ClassLoader");
DEFINE_CLASS = loader.getDeclaredMethod("defineClass",
new Class[]{ String.class,
byte[].class,
Integer.TYPE,
Integer.TYPE,
ProtectionDomain.class });
DEFINE_CLASS.setAccessible(true);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
return null;
}
});
最后一个(希望有用的)信息是我在OSGi包中运行项目时调用defineClass方法的ClassLoader:它是org.apache.felix.framework.BundleWiringImpl的一个实例。
如果有人可以帮助我,那就太好了!
问候, 帕斯卡
编辑: 我需要在运行时定义类,因为我想避免在我的项目中使用样板代码并使程序更加一致。
更确切地说,我的项目将是一个RESTful WebService。由于我使用多种技术来存储数据和snychronize进程(mongoDB,MySQL,activeMQ,...),我想使用Apache camel来处理所有不同的技术。 问题是我不可能知道将Camel与REST上的Java方法很好地集成(方法和类到HTTP请求的整个映射是通过Annotations完成的)。 所以我唯一的可能性就是编写方法,将请求的参数放在Camel的交换头中,然后将它们激活到路由中。 为了避免这种情况,我希望通过路由定义在运行时定义这些类来自动执行此过程。