zoukankan      html  css  js  c++  java
  • Java动态代理之cglib

    cglib是对jdk动态代理的补充,弥补了因没有接口的类生成代理类的缺失。
    下面通过简单的例子学习一下cglib的使用,当然,要是用需要第三方的jar包,jar包自行下载。

    业务类

    public class BankService {
        public void save(){
            System.out.println("存钱...");
        }
    }

    业务增强类

    public class ServiceEnhancer {
        public static void before(){
            System.out.println("检查钱是否完整无存");
        }
    
        public static void after(){
            System.out.println("如果有错,就回滚");
        }
    }
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class CglibProxy implements MethodInterceptor{
    
        private Enhancer enhancer = new Enhancer();
    
        public Object getProxy(Class<?> clazz){
            //设置 需要创建子类的类
            enhancer.setSuperclass(clazz);
            enhancer.setCallback(this);
    
            return enhancer.create();//通过字节码技术创建子类实例
        }
    
        @Override
        public Object intercept(Object obj, //目标类实例
                Method method, //目标类方法的反射对象
                Object[] args, //方法的动态入参
                MethodProxy proxy //代理类实例
                ) throws Throwable {
            ServiceEnhancer.before();
            Object result = proxy.invokeSuper(obj, args);
            ServiceEnhancer.after();
            return result;
        }
    
    }
    public class CglibDemo {
        public static void main(String[] args) {
            CglibProxy proxy = new CglibProxy();
    
            BankService bankservice = (BankService) proxy.getProxy(BankService.class);
    
            bankservice.save();
    
            //com.proxy.cglib.BankService$$EnhancerByCGLIB$$82923c9a@2e5d6d97
            //System.out.println(bankservice);
        }
    }
  • 相关阅读:
    appium---纯web app测试
    appium---元素定位工具
    appium---[ADB] Killing adb server on port 5037报错
    pytest---自定义用例识别规则
    pytest---用例执行顺序
    解决Could not find function xmlCheckVersion in library libxml2问题
    pytest---测试框架初探
    layoutSubviews何时被调用
    'addTimeInterval:' is deprecated: first deprecated in iOS 4.0
    iOS7 表格separatorInset的处理
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608413.html
Copyright © 2011-2022 走看看