有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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) 个答案

  1. # 1 楼答案

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