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