本人在学习框架阶段时,意识到动态代理的重要性。它是学习java框架的基础,如果不太了解动态代理技术,那么在学习Sping框架时多多少少会有点不了解。
下面我们开始学习java的动态代理
举个例子:
唱、跳、rap、篮球是一位明星的技能,我们将其抽取出接口
public interface Skill {
void sing();
void jump();
void rap();
void playBasketball();
}
那我们明星肯定是要实现这个接口的呀,他要具备这些技能,才有人粉他的嘛。每个明星还有他自己的名字,我们给他定义一个成员属性,下面是明星类定于:
public class Start implements Skill {
private String name;
public Start(String name) {
this.name = name;
}
@Override
public void sing() {
System.out.println(this.name + "唱歌666");
}
@Override
public void dance() {
System.out.println(this.name + "跳舞666");
}
@Override
public void rap() {
System.out.println(this.name + "rap666");
}
@Override
public void playBasketball() {
System.out.println(this.name + "打篮球666");
}
}
假如有一天我想请这个明星来我们村里表演。好家伙,我找他肯定不行啊。别人是大明星,你想找他必须先找他的经纪人!要收钱的嘛!这个经纪人就好比明星的代理对象。
下面我们创建一个类来获取明星类的代理对象
public class StartAgentProxy {
/**
* 设计一个方法来返回一个明星对象的代理对象
*/
public static Skill getProxy(Start start) {
//为明星生成代理对象
return (Skill) Proxy.newProxyInstance(start.getClass().getClassLoader(), start.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("收首付款。。。");
//真正让明星去唱歌/跳舞/rap/打篮球
//method 正在被调用的方法对象 args代表这个方法的参数
Object rs = method.invoke(start);
System.out.println("收尾款。。。");
return rs;
}
});
}
}
这样我们的基本代码就写完了,下面我们编写main函数进行测试
public class Test {
public static void main(String[] args) {
Start start = new Start("那个男人");
Skill proxy = StartAgentProxy.getProxy(start);
proxy.sing();
// proxy.dance();
// proxy.rap();
// proxy.playBasketball();
}
}
输出打印:
第一次写博客,写的不好请多多包含!