JDK动态代理-AOP编程

在这里插入图片描述
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;
    }
}

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿维的博客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值