栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

动态代理解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态代理解析

1.动态代理的作用:

可以报一些相同的内容抽取出来做成一个代理,然后让不同的内容让真实类去执行。

注:这里的真实类是相对于代理对象。两个操作的内容不同。

2.动态代理操作:

将不同的内容抽取成接口,创建一个类去实现这些接口,这个实现的类就是真实类。

例子:

public interface UserService {
    // 注册
    public abstract void register(String name, String password);
    // 登录
    public abstract void login(String name, String password);
    // 查询所有用户
    public abstract void showUsers();
}

注:这里将需要操作的内容抽取成接口

创建一个类去实现接口作为真实类:

public class UserServiceImpl implements UserService {
    // 注册
    @Override
    public void register(String name, String password) {
        try {
            Thread.sleep(888);
        } catch (InterruptedException e) {}
        System.out.println("模拟注册功能!" + name + " : " + password);
    }

    // 登录
    @Override
    public void login(String name, String password) {
        try {
            Thread.sleep(1888);
        } catch (InterruptedException e) {}
        System.out.println("模拟登录功能!" + name + " : " + password);

    }

    // 查询所有用户
    @Override
    public void showUsers() {
        try {
            Thread.sleep(2888);
        } catch (InterruptedException e) {}
        System.out.println("模拟查询所有用户功能!");
    }
}

说明:这里使用休眠来模拟各个功能所需要的耗时。

创建一个测试类:

 public static void main(String[] args) {
        //创建真实类
        UserServiceImpl userService = new UserServiceImpl();
        //创建代理对象
        UserService proxy = (UserService)Proxy.newProxyInstance(//将object强转为真实类
                Demo06.class.getClassLoader(),//类加载器
                new Class[]{UserService.class},//接口类等待代理去实现
                new InvocationHandler() {//处理器接口,放匿名内部类
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long start = System.currentTimeMillis();
                        //类调用执行,里面传入真实要实现的类,以及参数
                        Object invoke = method.invoke(userService, args);
                        long end = System.currentTimeMillis();
                        System.out.println(method.getName()+"运行时间为:"+(end - start));
                        return invoke;
                    }
                }
        );
        proxy.login("admin","pass123");
        proxy.register("admin","pass123");
        proxy.showUsers();
    }

部分代码说明:

Proxy(代理):来自于java的反射包通过Proxy的静态方法获取一个代理对像Proxy.newProxyInstance

static Object    newProxyInstance​(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回指定接口的代理实例,该代理实例将方法调用分派给指定的调用处理程序。  

参数说明: ClassLoader loader   类加载器对象:通过类名.Class获取类的反射对象再通过getClassLoader()方法获取类的加载器对象。

Class[] interfaces 接口类:接口等待去实现,数组可以有多个接口类。(但可以定一个父类去将所有子类接口合为一起)

InvocationHandler h  处理器接口,放匿名内部类

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930411.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号