动态代理的优点

动态代理类:在程序运行时,通过反射机制动态生成。
动态代理类通常代理接口下的所有类。
动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。
动态代理的调用处理程序必须事先InvocationHandler接口,及使用Proxy类中的newProxyInstance方法动态的创建代理类。

 

动态代理的优点:

可以在不改变方法源码的情况下,实现对方法功能的增强,提高代码复用性。

简化了编程工作,提高开发效率,同时提高软件系统的可扩展性

可以为被代理对象的所有方法做代理

非常灵活 支持任意接口类型的实现类对象做代理,也可以直接接本身做代理

 

 

 

复制代码
package d9_proxy;

/**
 * FileName: Test2
 * Author:   lps
 * Date:     2022/4/26 14:04
 * Sign:刘品水 Q:1944900433
 */
public class Test2 {
    //掌握使用动态代理解决问题 理解动态代理的优势
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService proxy = ProxyUtil.getProxy(userService);
        proxy.login("admin", "123456");
        proxy.selectUsers();
        proxy.delectUser();
        proxy.delectById(9);


    }

}
复制代码
复制代码
package d9_proxy;

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

/**
 * FileName: ProxyUtil
 * Author:   lps
 * Date:     2022/4/26 14:28
 * Sign:刘品水 Q:1944900433
 */
public class ProxyUtil {
    /**
     * 通过静态方法 为用户业务对象返回一个代理对象
     */
    public static UserService getProxy(UserService obj){
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long startTime=System.currentTimeMillis();
                        Object rs = method.invoke(obj, args);
                        long endTime=System.currentTimeMillis();
                        System.out.println(method.getName() +"方法耗时:"+(endTime-startTime)/1000.0+"s");
                        return rs;
                    }
                });
    }
}
复制代码
复制代码
package d9_proxy;

/**
 * FileName: UserService
 * Author:   lps
 * Date:     2022/4/26 14:03
 * Sign:刘品水 Q:1944900433
 */
public interface UserService {
    String login(String loginName, String password);

    void delectUser();

    String selectUsers();

    void delectById(int id);
}
复制代码
复制代码
package d9_proxy;

/**
 * FileName: UserServiceImol
 * Author:   lps
 * Date:     2022/4/26 14:06
 * Sign:刘品水 Q:1944900433
 */
public class UserServiceImpl implements UserService {
    @Override
    public String login(String loginName, String password) {
        String rs = "账号和密码有错";
        if ("admin".equals(loginName) && "123456".equals(password)) {
            rs = "登陆成功";
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;

    }

    @Override
    public void delectUser() {
        try {
            System.out.println("您正在删除用户....");
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    @Override
    public String selectUsers() {
        String rs = "查询了10000个用户数据";
        try {
            System.out.println("正在为您查询...");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;

    }

    @Override
    public void delectById(int id) {

        try {
            System.out.println("根据用户的身份证号" + id + "删除了它~~");
            Thread.sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
复制代码

 

posted @   刘品水  阅读(415)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示