动态代理
一、概述
1.作用
在原始类方法的基础上,为所有方法添加新的行为。
2.用法
以原始类实现的接口为基准,再生成一个代理对象,对象内的方法为在原始方法基础上的增强方法。
代码示例:
- Star接口
public interface Star {
String sing(String name);
void dance();
}
- BigStar实现类
public class BigStar implements Star{
private String name;
public BigStar(String name) {
this.name = name;
}
public String sing(String name){
System.out.println(this.name + "正在唱" + name);
return "谢谢!";
}
public void dance(){
System.out.println(this.name + "正在跳舞");
}
}
- 产生代理对象
public class ProxyUtil {
public static Star createProxy(BigStar bigStar){
Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
new Class[]{Star.class}, new InvocationHandler() {
//回调方法,相当于原始方法的增强方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理对象需要做的事情
if(method.getName().equals("sing")){
System.out.println("准备话筒,收钱20W");
} else if (method.getName().equals("dance")) {
System.out.println("准备场地,收钱50W");
}
//调用原始方法
return method.invoke(bigStar, args);
}
});
return starProxy;
}
}