JDK动态代理(1)

参考博客:

https://www.cnblogs.com/liuyun1995/p/8144628.html

https://www.cnblogs.com/liuyun1995/p/8157098.html

https://www.cnblogs.com/liuyun1995/p/8144676.html

https://www.cnblogs.com/liuyun1995/p/8144706.html

https://blog.csdn.net/wangqyoho/article/details/77584832

静态代理与动态代理

静态代理

代理接口:UserDao.java

public interface UserDao {    
  void save();     
}

目标对象:UserDaoImpl.java

public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("正在保存用户...");
    }
}

代理对象:TransactionHandler.java

public class TransactionHandler implements UserDao {
    //目标代理对象
    private UserDao target;
    //构造代理对象时传入目标对象
    public TransactionHandler(UserDao target) {
        this.target = target;
    }
    @Override
    public void save() {
        //调用目标方法前的处理
        System.out.println("开启事务控制...");
        //调用目标对象的方法
        target.save();
        //调用目标方法后的处理
        System.out.println("关闭事务控制...");
    }
}

测试

public class Main {
    public static void main(String[] args) {
        //新建目标对象
        UserDaoImpl target = new UserDaoImpl();
        //创建代理对象, 并使用接口对其进行引用
        UserDao userDao = new TransactionHandler(target);
        //针对接口进行调用
        userDao.save();
    }
}

动态代理

代理接口:Car.java

public interface Car {
    void drive(String driverName, String carName) ;
}

目标对象:Audi.java

public class Audi implements Car {
    @Override
    public void drive(String driverName, String carName) {
        System.err.println("Audi is driving... " + "driverName: " + driverName + ", carName" + carName);
    }
}

代理对象:CarHandler

public class CarHandler implements InvocationHandler {
    private Car car;
    public CarHandler(Car car) {
        this.car = car;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before----");
        method.invoke(car,args);
        System.out.println("after-----");
        return null;
    }
}

测试

public class ProxyTest {
    public static void main(String[] args) {
        Car audi = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(),new Class<?>[] {Car.class},new CarHandler(new Audi()));
        audi.drive("name1","audi");
    }
}

总结:

  • 两者都是基于接口的代理

  • 静态代理中代理类和接口类高度耦合 , 对于每个目标对象 , 都必须创建一个代理对象 ;或者一个代理对象实现了多个方法 , 但是会产生许多重复的逻辑

  • 动态代理中代理对象实现了InvocationHandler接口 , 通过反射机制 , 动态代理在运行过程中为每个目标对象生成对应的代理类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值