TWT Studio - Android 组培训 & 技术分享

Proxy模式——动态代理

2018-07-16  本文已影响12人  吃啥呀

java设计模式


静态代理 :一个RealSubject类对应一个Proxy类
如果有多个RealSubject,该怎么办呐?

动态代理

1.创建抽象类

public interface Subject {
    void eat() throws Exception;//抽象主题
}

2.创建真实类RealSubject——被代理的类

import java.util.Random;

public class Pig implements Subject{
    //RealSubject真实主题
    @Override
    public void eat() throws Exception {
        Thread.sleep(new Random().nextInt(1000));
        System.out.println("猪正在吃饭中......");
    }
}

3.创建事务处理器

InvocationHandler接口
public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

参数:
proxy 被代理的对象(真实对象RealSubject)
method 被代理对象的方法(所哦调用真实对象的某个方法的Method对象)
args 方法的参数(调用真实对象某个方法时接受的参数)
返回:
Object 方法返回值

具体实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{
    private Object object;//绑定委托对象,即具体实现类的实例化对象

    public TimeHandler(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("猪开始吃饭…");
        method.invoke(object, args);
        long stopTime = System.currentTimeMillis();
        System.out.println("猪结束吃饭");
        System.out.println("猪的吃饭时间:" + (stopTime - startTime) + "毫秒!");
        return null;
    }
}

4.测试类

Proxy类——动态创建一个代理对象的类
public class Proxy implements java.io.Serializable {
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h) {
        //这个方法的作用:得到一个动态的代理对象
       ......
    }
}

loader 类加载器:定义了由哪个ClassLoader对象来对生成的代理对象加载
interfaces 实现接口:Intrface对象数组,表示的是将要给代理的对象提供一组什么接口,如果我提供了一组接口,它就实现该接口——就能调用该接口的方法
h InvocationHandler:表示的是当动态代理对象在调用方法时,会关联到哪个InvocationHandler对象上

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

public class Main {

    public static void main(String[] args) throws Exception {
         Pig pig = new Pig();
         InvocationHandler handler = new TimeHandler(pig);
         Class<?> cls = pig.getClass();

         Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),handler);
         subject.eat();
    }
}

5.运行结果

Main.png

动态代理&静态代理 :动态代理不需要我们去编写代理类,在程序中动态生成,而静态代理是则是我们自己编写好类

上一篇 下一篇

猜你喜欢

热点阅读