首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在玻璃鱼设备中实现Byte-Buddy代理时出错

在玻璃鱼设备中实现Byte-Buddy代理时出错
EN

Stack Overflow用户
提问于 2016-05-16 23:07:58
回答 1查看 140关注 0票数 2

我无法在玻璃鱼服务器中实现BB代理。当我尝试使用生成的类时,它会抛出:

代码语言:javascript
复制
Grave:   java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#findClass
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Resolved.loadClass(ClassInjector.java:401)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:210)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:204)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:119)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4350)
at ar.gov.santafe.mpa.odbogm.proxy.ObjectProxyFactory.create(ObjectProxyFactory.java:77)

下面是生成代理对象的方法类:

代码语言:javascript
复制
public static <T> T create(T o, OrientElement oe, SessionManager sm ) {
    T po = null;
    try {
        ObjectProxy bbi = new ObjectProxy(o,oe,sm);
        po = (T) new ByteBuddy()
                .subclass(o.getClass())
                .implement(IObjectProxy.class)
//                   .method(isDeclaredBy(IObjectProxy.class))
                    .method(any())
                    .intercept(MethodDelegation.to(bbi))
                .make()
                .load(o.getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
                .getLoaded().newInstance();
        bbi.___setProxyObject(po);

    } catch (InstantiationException ex) {
        Logger.getLogger(ObjectProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(ObjectProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
    }
    return po;
}

这里是完整的堆栈跟踪。

注意:代码运行良好,并通过了独立jvm中的所有测试。

这是玻璃鱼的装载机!我无法让它从WEB/lib加载类。

EN

回答 1

Stack Overflow用户

发布于 2016-05-30 15:37:18

o.getClass()的类加载器看不到IObjectProxy,所遇到的错误类似于调用:

代码语言:javascript
复制
Class.forName(IObjectProxy.class.getName(), 
              false,
              o.getClass().getClassLoader());

似乎不可能在你的玻璃鱼设置。你有不同的解决方案:

  1. 通过这样配置您的项目,确保IObjectProxyo.getClass().getClassLoader()是可见的。
  2. 如果IObjectProxy.class.getClassLoader()o.getClass().getClassLoader()的子级,则使用这个类加载器。
  3. 定义一个MultipleParentClassLoader (Buddy的一部分),它是两个类加载器的子类,用于加载被检测的类。您可以通过调用: 新MultipleParentClassLoader.Builder() .append(IObjectProxy.class,o.getClass()) .build();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37264607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档