靜态代理示圖
代理對象裡面是沒有實際的方法的,執行方法是調用目标對象的方法,其中可以對目标方法進行增強。
動态代理:
動态代理的代理對象不需要實際建立,當要使用的時候,才會在記憶體動态生産代理對象執行目标的方法。
示範1:
示範2:
代理對象,在記憶體動态生成,傳入接口數組時候,決定傳回代理對象的類型。調用的方法,實際是通過傳入目标對象,再調用目标對象方法。
目标對象:
package com.itheima.proxy;
public class Target implements TargetInterface{
@Override
public void method1() {
System.out.println("method1 running...");
}
@Override
public String method2() {
System.out.println("method2 running...");
return "method2";
}
@Override
public int method3(int x) {
return x;
}
}
共同實作的接口:
package com.itheima.proxy;
public interface TargetInterface {
public void method1();
public String method2();
public int method3(int x);
}
動态代理:
package com.itheima.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest2 {
public static void main(String[] args) {
final Target target = new Target();
//動态建立代理對象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
//被執行幾次?------- 看代理對象調用方法幾次
//代理對象調用接口相應方法 都是調用invoke
/*
* proxy:是代理對象:不要輕易調用,造成死循環
* method:代表的是目标方法的位元組碼對象
* args:代表是調用目标方法時參數
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//反射知識點
Object invoke = method.invoke(target, args);//目标對象的相應方法
//retrun傳回的值給代理對象
return invoke;
}
}
);
proxy.method1();//調用invoke---Method:目标對象的method1方法 args:null 傳回值null
String method2 = proxy.method2();//調用invoke---Method:目标對象的method2方法 args:null 傳回值method2
int method3 = proxy.method3(100);調用invoke-----Method:目标對象的method3方法 args:Object[]{100} 傳回值100
System.out.println(method2);
System.out.println(method3);
}
}