首先,需要一个接口
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(); } }
输出结果预览
*****调用方法前加入的代码 猫吃老鼠 #####调用方法后加入的代码 *****调用方法前加入的代码 喵~喵~喵~ #####调用方法后加入的代码