java深入学习之代理

AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。使用反射生成JDK动态代理,可以实现面向切面的功能,即AOP,下面通过案例来展示反射在AOP中使用的作用:

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

public class AOPTest {  

interface Dog {  
void info();  
void run();  
}  

static class GunDog implements Dog {  

@Override  
public void info() {  
System.out.println("I am a gundog!");  
}  

@Override  
public void run() {  
System.out.println("I run fast!");  
}  

}  

static class Authority {  
//第一个拦截方法  
public void first() {  
System.out.println("------第一个切面方法------");  
}  
//第二个拦截方法  
public void last() {  
System.out.println("------最后一个切面方法------");  
}  
}  

static class MyInvocationHandler implements InvocationHandler {  
//需要被代理的对象  
private Object target;  

public void setTarget(Object target) {  
this.target = target;  
}  
//执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法  
public Object invoke(Object proxy, Method method, Object[] args)  
throws Exception {  
Authority authority = new Authority();  
//执行权限对象中的in方法  
authority.first();  
System.out.println("正在执行的方法:" + method);  
//if (args != null) {  
//System.out.print("执行该方法时传入的实参:");  
//for (Object val : args) {  
//System.out.println(val);  
//}  
//} else {  
//System.out.println("调用该方法没有实参!");  
//}  
System.out.print("执行结果:");  
Object result = method.invoke(target, args);  
//执行权限对象中的out方法  
authority.last();  
return result;  
}  
}  

static class MyProxyFactory {  
//为制定的target生成动态代理对象  
public static Object getProxy(Object target) throws Exception {  
//创建一个MyInvocationHandler对象  
MyInvocationHandler handler = new MyInvocationHandler();  
//为MyInvocationHandler设置target对象  
handler.setTarget(target);  
//创建并返回一个动态代理  
return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
target.getClass().getInterfaces(), handler);  
}  
}  

public static void main(String[] args) throws Exception {  
//创建一个原始的GunDog对象,作为target  
Dog target = new GunDog();  
//以制定的target来创建动态代理对象  
Dog dog = (Dog) MyProxyFactory.getProxy(target);  
dog.info();  
dog.run();  
}  
}  

注意:

执行动态代理对象的所有方法时,都会被替换成执行invoke方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值