代理模式
简介:
不直接操作实际的对象,而是通过代理对象间接操作实际对象,具体使用者不知道操作的具体
对象还是实际对象。
静态代理
1、例
1)、被代理类
package demo3;
public class AA {
public void method(){
System.out.println("adfadf");
}
}
2)、代理类
public class BB {
private Object aa;
public BB(Object aa) {
super();
this.aa = aa;
}
public Object getAa() {
return aa;
}
}
3)、测试
package demo3;
public class Example {
public static void main(String[] args) {
AA aa=new AA();
BB bb=new BB(aa);
((AA)(bb.getAa())).method();
}
}
Java动态代理---动态类Proxy的使用
1、被代理类接口
package demo2;
public interface IA {
public String method1(String str,String str1);
public void method2();
}
2、被代理类
package demo2;
public class A implements IA{
@Override
public String method1(String str,String str1) {
System.out.println("method1------"+str+"------"+str1);
return str1;
}
@Override
public void method2() {
System.out.println("method2");
}
}
3、代理类
package demo2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HandleProxyA implements InvocationHandler {
private IA ia;
public HandleProxyA(IA ia) {
super();
this.ia = ia;
}
/**
* @param proxy:被代理类
* @param method :被代理类方法
* @param args :被代理类方法 方法列表
* @return 返回值为被代理类方法返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(args!=null){
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
Object result = method.invoke(ia, args);
System.out.println(result);
return result;
}
}
4、实例
package demo2;
import java.lang.reflect.Proxy;
public class Example {
public static void main(String[] args) {
IA ia=new A();//被代理
HandleProxyA proxyA=new HandleProxyA(ia);//代理
//创建动态代理对象
IA ia2 = (IA) Proxy.newProxyInstance(ia.getClass().getClassLoader(),ia.getClass().getInterfaces(), proxyA);
ia2.method1("asdfad","245245");
ia2.method2();
}
}