当前位置: 首页 > 知识库问答 >
问题:

java - cglib生成代理对象为null?

司空劲
2023-05-02

向createProxy和getProxy这两个方法传了个接口类型的类,为什么生成代理对象为null呢【吐血】大佬们救救
image.png

image.png

public class ObjectProxy implements MethodInterceptor {

    private static Logger log = LoggerFactory.getLogger(ObjectProxy.class);

    private static final Map<Class<?>, Object> PROXY_MAP = new ConcurrentHashMap<>();
    private final Client client;
    private final String serviceName;
    private final String interfaceName;
    private static final AtomicInteger RPC_ID = new AtomicInteger(10000);
    private ObjectMapper objectMapper = new ObjectMapper();

    public ObjectProxy(Client client, String serviceName, String interfaceName) {
        this.client = client;
        this.serviceName = serviceName;
        this.interfaceName = interfaceName;
    }


    public Object createProxy(Class<?> clazz) {
        //创建动态代理增强类
        Enhancer enhancer = new Enhancer();
        //设置类加载器
        enhancer.setClassLoader(clazz.getClassLoader());
        //设置被代理类
        enhancer.setSuperclass(clazz);
        //拦截触发回调执行intercept
        enhancer.setCallback(this);
        return enhancer.create();
    }


    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> clazz) {
        try {
            T proxy = (T) PROXY_MAP.computeIfAbsent(clazz, (this::createProxy));
            if (proxy == null) {
                log.error("Failed to create proxy for class {}", clazz.getName());
            }
            return proxy;
        } catch (Exception e) {
            log.error("Error creating proxy for class {}", clazz.getName(), e);
        }
        return null;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        Object[] params = new Object[objects.length];
        for (int i = 0; i < objects.length; i++) {
            params[i] = objectMapper.writeValueAsString(objects[i]);
        }


        //TODO Client发送请求
        RpcRequest rpcRequest = new RpcRequest();
        rpcRequest.setMethodName(method.getName());
        rpcRequest.setServiceName(serviceName);
        rpcRequest.setInterfaceName(interfaceName);
        rpcRequest.setParameterTypes(method.getParameterTypes());
        rpcRequest.setParameterValues(params);
        rpcRequest.setRpcId(RPC_ID.getAndIncrement());
        return client.sendRequest(rpcRequest);
    }
}

共有1个答案

燕志学
2023-05-02
public class ObjectProxy implements InvocationHandler {

    // ... 其他代码 ...

    public Object createProxy(Class<?> clazz) {
        return Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, this);
    }

    // ... 其他代码 ...

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在此处实现方法拦截逻辑
    }
}
 类似资料:
  • 我在controller中使用CGlib代理进行拦截方法,并为此添加了一些行为。但是我遇到了一个问题,当controller有autowired Bean时,它没有初始化,并且返回为null 代理生成as

  • 问题内容: 使用vlcj组件,由于AOP代理对象为null,因此自定义组件出现。 MediaList类别 自定义MediaList类 弹簧配置类 AOP配置类 测试代码 我尝试单步跟踪,当TestMediaList构建完成时。该方法的MediaListInstance()返回正常值,但是当spring返回到代理对象时,将返回null。同时,如果您不使用AOP,我也会尝试正确返回该值。因此,我确定了

  • 问题内容: 我正在寻找一种为任何类型的Java对象生成校验和的解决方案,对于产生相同对象的应用程序的每次执行,该校验和都保持不变。 我尝试了,但是api说 ....从应用程序的一个执行到同一应用程序的另一个执行,此整数不必保持一致。 问题答案: 我遇到了类似的问题(为XML文件生成良好的哈希码),我发现最好的解决方案是通过MessageDigest使用MD5,或者如果您需要更快的速度:Fast M

  • 所以我的问题是,为什么交易未能将它从Hibernate代理转换为真正的对象?而且,如果我从上面的注释中删除(fetch=fetchtype.lazy)部分,这是一个变通方法吗?不过,我不愿意这样做,因为上面的代码实际上在Measure的父类中,它可能会对其他代码产生连锁反应。(为了更简单的说明,我移动了贸易属性来度量)。

  • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类

  • 本文向大家介绍Java 动态代理与CGLIB详细介绍,包括了Java 动态代理与CGLIB详细介绍的使用技巧和注意事项,需要的朋友参考一下 静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的。 1.1 静态代理的弊端 如果要想为多个类进行代理,则需要建立多个代理类,维护难度加大。 仔细想想,为什么静态代理会