jdk动态代理

首先,需要一个接口


package com.memorycat.aoptest.jdkproxy;

public interface Animal {
	void eat(String food);
	String say();
}
然后猫可以继承这个动物接口



package com.memorycat.aoptest.jdkproxy;

public class Cat implements Animal {

	@Override
	public void eat(String food) {
		// TODO Auto-generated method stub
		System.out.println("猫吃"+food);
	}

	@Override
	public String say() {
		// TODO Auto-generated method stub
		String miao="喵~喵~喵~";
		System.out.println(miao);
		return miao;
	}

}
这里加入一个自定义处理,,可以在方法调用前后加入自己的代码



package com.memorycat.aoptest.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class CatInvocationHandler implements InvocationHandler {

	Object obj;

	public CatInvocationHandler(Object obj) {
		this.obj = obj;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("*****调用方法前加入的代码");
		Object invokeResult = method.invoke(obj, args);
		System.out.println("#####调用方法后加入的代码");
		return invokeResult;
	}

}



最后我们写一个测试代码


package com.memorycat.aoptest.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Tester {

	public static void main(String[] args) throws Throwable {
		// TODO Auto-generated method stub

		// 第一种方法获取代理对象
		// Object proxyObject = Proxy.newProxyInstance(
		// Cat.class.getClassLoader(),
		// Cat.class.getInterfaces(),
		// new CatInvocationHandler(new Cat()));

		// 第2种方法获取代理对象 ,,,建议使用第一种方法
		Class<?> proxyClass = Proxy.getProxyClass(Cat.class.getClassLoader(),
				Cat.class.getInterfaces());
		Object proxyObject = proxyClass.getConstructor(
				new Class[] { InvocationHandler.class }).newInstance(
				new CatInvocationHandler(new Cat()));
		
		

		Animal cat = (Animal) proxyObject;
		cat.eat("老鼠");
		System.out.println();
		cat.say();
	}
}




输出结果预览


*****调用方法前加入的代码
猫吃老鼠
#####调用方法后加入的代码

*****调用方法前加入的代码
喵~喵~喵~
#####调用方法后加入的代码


评论列表