栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK和cglib动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK和cglib动态代理

JDK和cglib动态代理 JDK动态代理开发
package indi.exer.yuluo.jdk;

import indi.exer.yuluo.proxy.User;
import indi.exer.yuluo.proxy.UserService;
import indi.exer.yuluo.proxy.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;



public class TestJDKProxy {

    public static void main(String[] args) throws Exception {
        // 创建原始对象
        
        
        
        final UserService userService = new UserServiceImpl();

        // jdk创建动态代理
        

        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                // 额外功能的添加
                System.out.println("--------proxy log---------");

                // 原始方法运行
                Object ret = (Object) method.invoke(userService, args);

                return ret;
            }
        };

        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(TestJDKProxy.class.
                getClassLoader(), userService.getClass().getInterfaces(), handler);

        userServiceProxy.login("suns", "123456");
        userServiceProxy.register(new User());

    }
}
CGlib的动态代理

CGlib创建动态代理的原理:父子继承关系创建代理对象,原始类作为父类,代理类作为子类,这样既可以保证2者方法一致,同时在代理类中提供新的实现(额外功能+原始方法)

package indi.exer.yuluo.CGlib;

import indi.exer.yuluo.proxy.User;



public class UserService {

    public void login(String name, String passwd) {
        System.out.println(" test UserService.login");
    }

    public void register(User user) {
        System.out.println("test UserService.register");
    }

}
package indi.exer.yuluo.CGlib;

import indi.exer.yuluo.proxy.User;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;



public class TestCGlib {

    public static void main(String[] args) {
        // 1 创建原始对象
        final UserService userService = new UserService();

        
        Enhancer enhancer = new Enhancer();

        // 借用类加载器
        enhancer.setClassLoader(TestCGlib.class.getClassLoader());
        // 指定父类
        enhancer.setSuperclass(userService.getClass());

        MethodInterceptor interceptor = new MethodInterceptor() {
            // 内部类实现intercept方法
            // 等同于 InvocationHandler --> invoke
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

                // 额外功能的添加
                System.out.println("------cglib log-------");

                Object ret = method.invoke(userService, args);

                return ret;
            }
        };

        enhancer.setCallback(interceptor);

        UserService userServiceProxy = (UserService) enhancer.create();

        userServiceProxy.login("yuluo", "123456");
        userServiceProxy.register(new User());
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/590674.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号