AOPTest.java,相当于main函数,经过代理工厂出来的Hello类对象就不一样了,这是Proxy.newProxyInstance返回的对象,会hello.addUser会替换为invoke函数,比如这里的hello.addUser("sun", "13434");
会被替换为public Object invoke(Object proxy, Method method, Object[] args)
,其中addUser对应method,hello变量对应FkInvocationHandler里面的target对象,然后
Object rvt = method.invoke(target, args);
翻译为
Object rvt = target.method(args);
,args是hello.addUser("sun", "13434");
里面的"sun"和"13434"的参数.
package com.hmdp.service.垃圾;
public class AOPTest {
public static void main(String[] args) {
Hello helloTarget = new HelloImpl();//原始的目标对象
// 为目标对象生成动态代理
Hello hello = (Hello) MyProxyFactory.getProxy(helloTarget);
hello.addUser("sun", "13434");
hello.deleteUser(1);
World world = new WorldImpl();
// 为目标对象生成动态代理
World worldProxy = (World) MyProxyFactory.getProxy(world);
worldProxy.info();
}
}
Hello.java的接口,interface
package com.hmdp.service.垃圾;
public interface Hello {
Integer addUser(String name,String pass);
void deleteUser(Integer id);
}
HelloImpl.java实现Hello接口
package com.hmdp.service.垃圾;
public class HelloImpl implements Hello
{
@Override
public Integer addUser(String name,String pass){
System.out.println("执行adduser方法"+name);
return 19;
}
@Override
public void deleteUser(Integer id){
System.out.println("执行delete方法"+id);
}
}
World.java是World接口
package com.hmdp.service.垃圾;
public interface World {
void info();
}
WorldImpl接口,实现World接口
package com.hmdp.service.垃圾;
public class WorldImpl implements World{
@Override
public void info()
{
System.out.println("执行info方法");
}
}
AuthUtil.java表示用于权限检查的类
package com.hmdp.service.垃圾;
public class AuthUtil {
public void auth(){
System.out.println("------模拟程序执行权限检查------");
}
}
FkInvocationHandler.java,用于负责写AOP编程逻辑这里的authUtil.auth()负责权限检查,在所有方法前面增加权限检查,logUtil.log负责在所有方法的后面都添加通用的处理逻辑,即打日志,这就是AOP编程的优势,如果这是几千个方法,那么工作量将会是巨大的,如果使用AOP编程,那么就能在所有方法执行逻辑位置增加处理,提高编程效率。
package com.hmdp.service.垃圾;
import java.lang.reflect.Method;
public class FkInvocationHandler implements java.lang.reflect.InvocationHandler{
//被代理的目标对象
private Object target;
public FkInvocationHandler(Object target)
{
this.target = target;
}
//动态的代理类的所有方法都将替换成该invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
AuthUtil authUtil = new AuthUtil();
// 执行权限检查
authUtil.auth();
Object rvt = method.invoke(target, args);//target.method(args);调用目标对象的Method方法
LogUtil logUtil = new LogUtil();
logUtil.log();
return rvt;
}
}