2021-07-08_动态代理之JDK动态代理的实现

本文通过实例展示了Java动态代理如何实现方法的增强,特别是在登录功能上增加权限控制。首先创建了登录功能接口及其实现类,然后定义了一个InvocationHandler实现类,用于在invoke方法中调用目标方法并添加权限验证的增强功能。最后,使用Proxy类创建动态代理对象,执行带有权限控制的登录操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动态代理的作用

动态代理的作用是实现AOP功能

2.代理实现功能描述

本次演示动态实现功能:为已经具有登录功能的方法增加权限控制

3.动态代理步骤

 * 实现动态代理的步骤
 1.创建接口,定义目标类要完成功能
 2.创建目标类实现接口
 3.创建InvocationHandler接口的实现类,在invoke方法中完成要代理类的功能
   		3.1.调用目标方法
		3.2 增强功能
 4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型

4.代码实现
4.1 创建具有登录功能的接口

public interface LoginManager {

    boolean login(String username,String password);
}

4.2实现接口方法

//目标类
public class LoginService implements LoginManager {
    @Override
    public boolean login(String username, String password) {
        //登录目标方法,验证用户名和密码是否正确,此处忽略具体的方法
        System.out.println("执行目标类目标方法,验证用户名和密码都正确");
        //如果用户名密码正确返回true,否则返回false,此处默认用户名密码正确
        return true;
    }
}

4.3创建InvocationHandler接口实现类

//必须要实现InvocationHandler接口,完成代理类要做的功能(1.调用目标方法,2.增强功能)
public class LoginHandler  implements InvocationHandler {

    private Object target = null;

    //动态代理:目标对象是活动的,不是固定的,需要传入进来
    //传入的是谁就给谁创建代理
    public LoginHandler(Object target) {
        //给目标对象赋值
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object res = null;
        res = method.invoke(target,args);//执行目标方法,即调用目标方法
		
		//以下为增强功能方法
        if(res != null){
        	boolean b = (boolean)res;
        	//如果b为true,表示用户名密码都在正确,否则表示不正确
        	//如果用户名密码都正确,则去进行权限验证,否则不进行验证直接返回false
        	if(b){
        		//此处进行权限验证的方法,具体方忽略,权限正确返回true,权限错误返回false
        		System.out.println("判断用户的权限是否有登录权限,发现该用户不具备当前登录的权限");
        		res = true;
        	}else{
        		res = false;
        	} 
        }
        return res;
    }
}

4.4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型

public static void main(String[] args) {
        //创建代理对象,使用Proxy
        //1.创建目标对象
        LoginManager factory = new LoginService();
        //2.创建InvocationHandler对象
        InvocationHandler handler = new LoginHandler(factory);
        //3.创建代理对象
        LoginManager proxy = (LoginManager)Proxy.newProxyInstance(factory.getClass().getClassLoader(),
                                                                    factory.getClass().getInterfaces(),
                                                                    handler);
        //4.通过代理执行方法
        boolean b = proxy.login("wensheng","123");
        System.out.println(b);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DYS_房东的猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值