先上代码:
package com.suning.sample.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//目标类接口
interface TargetService{
public void targetMethod();
}
//目标接口实现类
class TargetServiceImpl implements TargetService{
public void targetMethod() {
System.out.println("#######我是目标类的targetMethod方法");
}
}
//jdk动态代理工厂实现类
class JdkDymanicProxyFactory implements InvocationHandler{
private Object target;
public JdkDymanicProxyFactory(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("#######开始进行增强了#######");
System.out.println("-------增强目标类:" + target.getClass() + ";增强方法" + method.getName());
//利用反转调用目标类的方法
Object object = method.invoke(target, args);
return object;
}
}
/*
* jdk测试实现
*/
public class JdkTest {
public static void main(String[] args){
TargetService target = new TargetServiceImpl();
JdkDymanicProxyFactory jdkDymanicProxy = new JdkDymanicProxyFactory(target);
/*
* 利用newProxyInstance静态方法创建符合目标接口的jdk代理对象,传三个参数:
* 目标接口的类加载器,接口,整合目标类和代理工厂的编织器对象
*/
TargetService proxy = (TargetService)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
jdkDymanicProxy);
proxy.targetMethod();
}
}
执行结果:
主要是利用了Proxy以及实现InvocationHandler接口对有接口的实现类进行代理,属于JDK1.3以后推出的动态代理,对实现AOP再好不过了。