代理

只谈情不闲聊 提交于 2019-11-28 18:42:15

静态代理

public interface Subject {
    void dealTask(String taskName);
}

public class RealSubject implements Subject {
    @Override
    public void dealTask(String taskName) {
        System.out.println("Running Task:" + taskName);
        try {
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class ProxySubject implements Subject {
    private Subject delegate;

    public ProxySubject(Subject delegate) {
        this.delegate = delegate;
    }

    @Override
    public void dealTask(String taskName) {
        long startTime = System.currentTimeMillis();
        delegate.dealTask(taskName);
        long endTime = System.currentTimeMillis();
        System.out.println("Running time:" + (endTime - startTime) + " timeMills");
    }
}

public class SubjectStaticFactory {
    public static Subject getInstance(){
        return new ProxySubject(new RealSubject());
    }
}

public class Client {
    public static void main(String[] args) {
        Subject proxy=SubjectStaticFactory.getInstance();
        proxy.dealTask("DBQuery by static proxy");
    }
} 

动态代理

public class SubjectInvocationHandler implements InvocationHandler {
    private Object delegate;

    public SubjectInvocationHandler(Object delegate) {
        this.delegate = delegate;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        method.invoke(delegate, args);
        long endTime = System.currentTimeMillis();
        System.out.println("Running time:" + (endTime - startTime) + " timeMills");
        return null;
    }
}

public class DynProxyFactory {
    public static Subject getInstance() {
        Subject delegate = new RealSubject();
        InvocationHandler handler = new SubjectInvocationHandler(delegate);
        Subject proxy = null;
        proxy = (Subject) Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
                delegate.getClass().getInterfaces(), handler);
        return proxy;
    }
}

public class Client {
    public static void main(String[] args) {
        Subject proxy=DynProxyFactory.getInstance();
        proxy.dealTask("DBQuery by dynamic proxy");
    }
}

cglib代理

public class CgProxyFactory implements MethodInterceptor {

    private Object target;

    public CgProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        Enhancer en = new Enhancer();
        en.setSuperclass(target.getClass());
        en.setCallback(this);
        return en.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        long startTime = System.currentTimeMillis();
        method.invoke(target, objects);
        long endTime = System.currentTimeMillis();
        System.out.println("Running time:" + (endTime - startTime) + " timeMills");
        return null;
    }
}

public class Client {
    public static void main(String[] args) {
        Subject target = new RealSubject();
        RealSubject proxy= (RealSubject) new CgProxyFactory(target).getProxyInstance();
        proxy.dealTask("DBQuery by cglib proxy");
    }
}

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!