怎样使用Fastjson转换CGLIB生成的代理对象?

Mr_Po 发布于 2017/06/05 08:37
阅读 728
收藏 0
import java.lang.reflect.Method;

import com.alibaba.fastjson.JSON;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Test03 {

	interface User {

		String getName();

		void setName(String name);
	}

	static class UserImpl implements User {

		private String name = "user";

		@Override
		public String getName() {
			return this.name;
		}

		@Override
		public void setName(String name) {
			this.name = name;
		}

	}

	public static void main(String[] args) {

		User user = (User) Enhancer.create(User.class, new MethodInterceptor() {

			User impl = new UserImpl();

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

				return methodProxy.invoke(impl, args);
			}

		});

		System.out.println(JSON.toJSONString(user));

		user = new UserImpl();

		System.out.println(JSON.toJSONString(user));
	}

输出结果依次为:

{}
{"name":"user"}

求大神指点,如何将CGLIB生成的代理对象转化为json字符串。

加载中
1
battyman
battyman

你的代码是没有问题的,问题出在fastjson上(虽然这也不算是fastjson的错)

fastjson在初始化序列化器的时候,有这么一段代码:

SerializeConfig.java

private ObjectSerializer getObjectWriter(Class<?> clazz, boolean create) {
        
...... //省略

                if (TypeUtils.isProxy(clazz)) {
                    Class<?> superClazz = clazz.getSuperclass();

                    ObjectSerializer superWriter = getObjectWriter(superClazz);
                    put(clazz, superWriter);
                    return superWriter;
                }

                if (create) {
                    put(clazz, createJavaBeanSerializer(clazz));
                }
            }

            writer = serializers.get(clazz);
        }
        return writer;
    }

 

这个TypeUtils.isProxy方法:

    public static boolean isProxy(Class<?> clazz) {
        for (Class<?> item : clazz.getInterfaces()) {
            String interfaceName = item.getName();
            if (interfaceName.equals("net.sf.cglib.proxy.Factory") //
                    || interfaceName.equals("org.springframework.cglib.proxy.Factory")) {
                return true;
            }

            if (interfaceName.equals("javassist.util.proxy.ProxyObject") //
                    || interfaceName.equals("org.apache.ibatis.javassist.util.proxy.ProxyObject")
                    ) {
                return true;
            }
        }

        return false;
    }

显然是说,如果有增强代理,就使用clazz.getSuperclass(),也就是说,你用接口的话是没有用的。。。

 

 

所以这里有两个解决方案:

1.不用fastjson,用jackson就可以解决

2.在增强代理的时候,使用UserImpl.class

User user = (User) Enhancer.create(UserImpl.class, new MethodInterceptor() {
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部