標籤:java動態代理---動態類proxy的使用
代理模式
簡介:
不直接操作實際的對象,而是通過代理對象間接操作實際對象,具體使用者不知道操作的具體
對象還是實際對象。
靜態代理
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();
}
}
Java動態代理---動態類Proxy的使用