在OSGI环境中定义类时发生java ClassFormatError
我目前在做一个小项目,遇到了一些问题。在这个项目中,我试图从配置字符串动态创建类,并将其加载到JVM中
当我在“正常”环境(单元测试)中执行此操作时,一切正常。但是当我尝试在OSGI环境(ApacheKaraf)中创建类时,我收到一个ClassFormatError,消息为“非法类名”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方法的类加载器:它是org的一个实例。阿帕奇。费利克斯。框架BundleWiringImpl
如果有人能帮我,那就太好了
您好, 帕斯卡
编辑: 我需要在运行时定义类,因为我希望避免项目中的样板代码,并使程序更加一致
更准确地说,我的项目将是一个RESTful Web服务。因为我使用多种技术来存储数据和同步进程(mongoDB、MySQL、activeMQ等等),我想使用ApacheCamel来处理所有不同的技术。 问题是,据我所知,不可能在REST上将Camel与Java方法很好地集成(方法和类到HTTP请求的整个映射都是通过注释完成的)。 因此,对我来说,唯一的可能就是编写方法,将请求的参数放在Camel的交换头中,并将它们发送到路由。 为了避免这种情况,我想通过在运行时从路由定义中定义这些类来自动化这个过程
# 1 楼答案
编写自己的类加载器,其父级为bundle's class loader,而不是试图侵入现有的类加载器