在OSGI环境中定义类时的ClassFormatError

时间:2014-05-18 22:50:28

标签: java osgi classloader karaf

我目前在处理我正在进行的一个小项目时遇到了问题。在这个项目中,我尝试从配置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的交换头中,然后将它们激活到路由中。 为了避免这种情况,我希望通过路由定义在运行时定义这些类来自动执行此过程。

1 个答案:

答案 0 :(得分:0)

编写自己的类加载器,其父级为bundle's class loader,而不是试图入侵现有的类加载器。