动态代理

动态代理,有人说就像是上课点名,你在宿舍,你的舍友帮你答到,有人说就像是你有一个摊位要收租金,你的儿子帮你去收,你人没去,虽然我说不上动态代理到底是什么,但是当自己跟着写出来这个过程之后,会有一点明白的

1、首先创建一个接口

public interface Flyable {
   void fly();
}

2、创建这个接口的实现类

public class Bird implements Flyable{

@Override
public void fly() {
    System.out.println("Bird is flying...");
     }
}

3、创建动态代理类

public class LoadHander implements InvocationHandler{

private Object obj;

public LoadHander(Object obj){
	this.obj = obj;
}

@Override
public Object invoke(Object proxy, Method method, Object[] arg2)
		throws Throwable {
	System.out.println("invoke begin ......");
	method.invoke(obj, arg2);
	System.out.println("invoke end ......");
	return null;
}

}

4、创建真正执行调用的接口(此处是基于spring boot项目进行创建的,上一篇既是,如果不想用基于spring boot的,那么直接写一个main方法调用就可以了)

@RequestMapping("/bird")
public void bird(){
  System.out.println( "Hello World!" );
  Flyable bird = new Bird();
	LoadHander loadHander = new LoadHander(bird);
	Flyable birdProx = (Flyable) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(),
			loadHander);
	birdProx.fly();
}

控制台调用,后端输出为

在这里插入图片描述

即动态代理中的method.invoke(obj, arg2); 这句是调用的我们的实现类,动态代理的好处就是,要做不同的操作,只要创建一个新的实现类就可以,而且调用的部分很多都是可以复用的,只要Flyable bird=new Bird(); 这句的实现类修改就完全可以了,这也就是动态代理相对于静态代理的优势所在

注:此为非spring boot的main方法调用

public class App {
public static void main(String[] args){
	Flyable bird = new Bird();
	LoadLander loadLander = new LoadLander(bird);
	Flyable birdProx = (Flyable) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(), loadLander);
	birdProx.fly();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值