java --動態代理之AOP

#1測試類ide

/**
 * 動態代理之AOP
 */
public class TestAOP {
	
	public static void main(String[] args) {
		//1.建立一個被代理類
		SuperMan sm = new SuperMan();
		//2.返回一個動態代理類
		Object obj =MyProxy.getProxyInstance(sm);
		//3.轉換
		Human hm = (Human) obj;
		//4.調用方法
		hm.info();
		//換行
		System.out.println("==================");
		//5.調用方法
		hm.fly();
	}
}

#2.接口測試

//接口
interface Human{
	void info();
	void fly();
}

#3.被代理類this

//被代理類
class SuperMan implements Human{

	@Override
	public void info() {
		System.out.println("我是超人");
	}

	@Override
	public void fly() {
		System.out.println("我能飛");
	}
}

#4.兩個固定模塊代理

//提供兩個固定方法
//需求:在這兩個方法之間動態的插入一個方法
class HumanUtil{
	public void method1(){
		System.out.println("-----方法1------");
	}
	public void method2(){
		System.out.println("-----方法2------");
	}
}

#5.代理類實現方法code

//代理類實現方法
class MyInvocation implements InvocationHandler{

	//被代理對象的聲明
	Object obj;
	
/*	//方法1:給代理對象賦值,經過set方法
	public void setObject(Object obj) {
		this.obj = obj;
	}*/
	//方法2:給代理對象賦值,經過構造器
	public MyInvocation(Object obj) {
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		/**
		 * 需求:在如上提供的兩個方法之間動態插入一個方法
		 */
		HumanUtil humanUtil = new HumanUtil();
		//1.調用方法1
		humanUtil.method1();
		//2.插入動態方法
		//這裏實際調用的是被代理類要執行的方法(即動態的方法)
		Object returnVal = method.invoke(obj, args);
		//3.調用方法2
		humanUtil.method2();
		return returnVal;
	}
}

#6.動態的建立一個代理類的對象對象

//動態的建立一個代理類的對象
class MyProxy{
	public static Object getProxyInstance(Object obj){
		MyInvocation handler = new MyInvocation(obj);
		//handler.setObject(obj);
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
	}
}
相關文章
相關標籤/搜索