Java中动态生成一个接口的实现类(CGLib实现)

1.代码

    /**
     * 被实现的接口
     */
    public interface MyService {
        /**
         * 有参数 无返回
         *
         * @param a a
         */
        void doSomething(String a);

        /**
         * 多类型参数 有返回
         *
         * @param a a
         * @param b b
         * @return String
         */
        String doSomething2(String a, Long b);
    }

    public static void main(String[] args) {
        MyService myService = createProxy(
                // 需要实现的接口
                MyService.class,
                // 设置方法拦截器
                (MethodInterceptor) (obj, method, args1, proxy) -> {
                    System.out.println("方法执行前拦截 - " + method.getName());
                    try {
                        // 可以在这里添加前置处理
                        System.out.println("参数:" + Arrays.toString(args1));
                        // 这里可以决定是否执行实际方法
                        if (method.getName().equals("doSomething2")) {
                            // 生成一个长整型ID
                            long snowflakeNextId = IdUtil.getSnowflakeNextId();
                            // 或者返回自定义结果
                            return "doSomething2 方法返回值 :" + snowflakeNextId;
                        }
                        // 或者返回自定义结果
                        return null;
                    } finally {
                        System.out.println("方法执行后拦截 - " + method.getName());
                    }
                });
        myService.doSomething("hahaha");
        String xixixi = myService.doSomething2("xixixi", 100L);
        System.out.println("doSomething2 返回值 : " + xixixi);
    }

    /**
     * Create Proxy
     *
     * @param interfaceClass interfaceClass
     * @param callback       callback
     * @param <T>            T
     * @return <T>
     */
    @SuppressWarnings("unchecked")
    public static <T> T createProxy(Class<T> interfaceClass,
                                    Callback callback) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Object.class);
        enhancer.setInterfaces(new Class<?>[]{interfaceClass});
        enhancer.setCallback(callback);
        return (T) enhancer.create();
    }

2.打印

方法执行前拦截 - doSomething
参数:[hahaha]
方法执行后拦截 - doSomething
方法执行前拦截 - doSomething2
参数:[xixixi, 100]
方法执行后拦截 - doSomething2
doSomething2 返回值 : doSomething2 方法返回值 :1941048989285089280

  

posted @ 2025-07-04 16:25  东峰叵,com  阅读(14)  评论(0)    收藏  举报