Dynamic Proxy
基本概念
代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象,这些操作通常涉及与“实际”对象的通信,因此代理通常充当中间人的角色。
java的动态代理可以动态的创建代理并动态的处理对所代理的方法的调用,在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。
1、创建被代理对象
2、创建代理对象
3、通过Proxy.newProxyInstance创建动态代理
创建被代理对象
首先创建一个被代理对象接口
package proxy;
public interface Star {
/**
* 唱歌
*/
String sing(String name);
/**
* 跳舞
*/
String dance(String name);
}
被代理对象实现类
package proxy;
public class StarImp implements Star {
@Override
public String sing(String name) {
System.out.println("开始唱歌:"+name);
return "演唱结束";
}
@Override
public String dance(String name) {
System.out.println("开始跳舞:"+name);
return "结束";
}
}
创建代理对象
通过调用Proxy.newProxyInstance()可以创建动态代理,这个方法需要得到
- 一个类加载器(通常可以从已经被加载的对象中获取其类加载器,然后传递给它)
- 一个你希望该代理实现的接口列表(不是类或抽象类)
- 以及InvocationHandler接口的一个实现
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class StarProxy {
private Star star=null;//被代理对象
public StarProxy(Star star) {//构造注入
this.star = star;
}
public Star createStarProxy(){
return (Star) Proxy.newProxyInstance(StarProxy.class.getClassLoader(),
star.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理动作
String methodName=method.getName();
if(methodName.equals("sing")){
Object info=method.invoke(star,args);//方法返回的信息
System.out.println("拉拉阿拉啦啦啦拉拉");
return info;
}else if(methodName.equals("dance")){
Object info=method.invoke(star,args);
System.out.println("吼吼哈哈嘿");
return info;
}else {
System.out.println("发呆!!!");
}
return null;
}
});
}
}
客户端调用
package proxy;
public class Client {
public static void main(String[] args) {
Star star=new StarImp();//创建被代理对象
StarProxy proxy=new StarProxy(star);//注入被代理对象
Star star1=proxy.createStarProxy();//创建代理对象
System.out.println(star1.sing("笨小孩"));//输出返回信息
System.out.println(star1.dance("breaking"));
}
}