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);
	}
}
相关文章
相关标签/搜索