天天看點

WEB技術:動态代理

靜态代理示圖

WEB技術:動态代理

代理對象裡面是沒有實際的方法的,執行方法是調用目标對象的方法,其中可以對目标方法進行增強。

動态代理:

動态代理的代理對象不需要實際建立,當要使用的時候,才會在記憶體動态生産代理對象執行目标的方法。

示範1:

WEB技術:動态代理
WEB技術:動态代理
WEB技術:動态代理

示範2:

WEB技術:動态代理

代理對象,在記憶體動态生成,傳入接口數組時候,決定傳回代理對象的類型。調用的方法,實際是通過傳入目标對象,再調用目标對象方法。

目标對象:

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);
		
	}
	
}
           
WEB技術:動态代理