java - 编码java代理

标签 java proxy jaxb

有人可以建议一种编码和解码 javaassyst 代理对象的方法吗?我想要 JAXB 或 xstream 方法之类的东西。 目前我看到只有一种方法可以解决这个问题

  • 创建承载与代理相同属性的平面类(这是一个问题,因为我有大约 300 个属性)
  • 写一些映射属性的反射(或使用类似 DOZER 的东西)(这可能会很慢且效率低下)
  • 使用xstream序列化对象使用mapper传输proxy -> flat -> xml or xml -> flat -> proxy

这种方法似乎效率低下,有没有人有更好的想法?

最佳答案

如果基类用Jackson json注解注解,那么它是代理的事实不会影响编码。以下是将代理对象编码为 JSON 的示例。

import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args){
        try {
            Bar bar = create(Bar.class);
            bar.setBar("something");
            ObjectMapper mapper = new ObjectMapper();
            String out = mapper.writeValueAsString(bar);
            Bar inBar = mapper.readValue(out, bar.getClass());
            System.out.println("Unmarshalled: " + inBar.getClass().getName() + " , bar: " + inBar.getBar());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static <T> T create(Class<T> classs) throws Exception {
        ProxyFactory factory = new ProxyFactory();
        factory.setSuperclass(classs);
        Class clazz = factory.createClass();
        MethodHandler handler = new MethodHandler() {

            @Override
            public Object invoke(Object self, Method overridden, Method forwarder,
                                 Object[] args) throws Throwable {
                System.out.println("I could be used for AOP "+overridden.getName());
                return forwarder.invoke(self, args);
            }
        };
        Object instance = clazz.newInstance();
        ((ProxyObject) instance).setHandler(handler);
        return (T) instance;
    }
}

class Bar{
    @JsonProperty
    private String bar = "bar";

    String getBar() {
        return bar;
    }

    void setBar(String bar) {
        this.bar = bar;
    }
}

关于java - 编码java代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665787/

相关文章:

Java 似乎没有正确比较 double

java - Eclipse Kepler 启动后崩溃,并显示消息 :-Java heap space

spring - 如何在 spring oauth2 OAuth2AccessToken 请求或如何覆盖 OAuth2AccessTokenSupport restTemplate 变量上设置代理?

web-services - 在外部为类创建 jaxb 注释

java - 使用 CXF 和 wsdl2java 生成代码时解决冲突

java - 如何部分编码/取消编码对象?

java - 在java中使用selenium webdriver运行cucumber测试时出现空指针异常

java - 什么复制文件的方法可以处理波浪号? (~)

linux - 调试 smtp 连接

c++ - 避免配置类为单例