JDK动态代理小栗子

现有功能:

public interface SomeService {
    void some();

    void other();
}

  

public class ServiceImpl1 implements SomeService {
    @Override
    public void some() {
        System.out.println("some 方法执行");
    }

    @Override
    public void other() {
        System.out.println("other 方法执行");
    }
}

  

假设接口有N多实现类,需要增加功能,需要在每一个类上增加需要功能的代码,十分繁琐

public class MyUtil {
    public static void log(){
        System.out.println("增加日志功能");
    }

    public static void trans(){
        System.out.println("增加事务处理");
    }
}

  

动态代理实现:

通过目标类对象获取代理类对象

public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj = null;
  //使用工具类增加日志功能 MyUtil.log(); obj = method.invoke(target,args);
  //模拟使用工具类处理完成后提交事务 MyUtil.trans(); return obj; } public Object getTarget(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } }

  

测试实现:

public class MyTest {
    public static void main(String[] args) {
  //目标类对象 SomeService service = new ServiceImpl1();
  //通过目标类对象获取代理类对象 SomeService proxy = (SomeService) new MyInvocationHandler(service).getTarget(); proxy.some(); System.out.println("======================="); proxy.other(); } }

  

 实现指定方法使用代理,增加功能

@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj = null;
        String name = method.getName();
        if ("some".equals(name)){
            MyUtil.log();
            obj  = method.invoke(target,args);
            MyUtil.trans();
        }else {
            obj  = method.invoke(target,args);
        }
        return obj;
    }

  

cglib动态代理:

第三方的工具库,创建代理对象,原理是继承通过继承目标类创建子类,子类就是代理对象

动态代理作用

  在目标类代码不改变的情况下,增加功能

  减少代码的重复

  专注业务代码逻辑

  解耦合,业务功能和事务,日志等功能分离

原文地址:https://www.cnblogs.com/ethnic/p/14581176.html