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

发布于 2021-12-02 00:53:28 字数 1106 浏览 878 评论 1

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字符串。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如日中天 2021-12-05 01:17:00

你的代码是没有问题的,问题出在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() {
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文