zoukankan      html  css  js  c++  java
  • Java代理(二)

    前面说到了java的静态代理,这次来看看动态代理。

    假设有如下接口和实现方法:

    package proxy;
    
    public interface Subject {
        public void request();
        public void response();
    }
    View Code
    package proxy;
    
    public class RealSubject implements Subject{
    
        public void request() {
            System.out.println("request...");
        }
    
        public void response() {
            System.out.println("response...");
        }
    
    }
    View Code

    然后,需求来了,希望在执行方法前后加某个其他的操作,那么动态代理会这么做:

    package proxy.dynamicProxy;
    
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class ProxyHandle implements InvocationHandler{
        private Object target;//目标对象
        public ProxyHandle(Object target){
            this.target = target;
        }
        
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("before...");
            Object retrunObj = method.invoke(target, args);
            System.out.println("afeter...");
            return retrunObj;
        }
    }
    View Code

    然后客户端的代码会这么写:

    package proxy.dynamicProxy;
    
    import java.lang.reflect.Proxy;
    
    import proxy.RealSubject;
    import proxy.Subject;
    
    public class DynamicProxyTestMain {
    
        public static void main(String[] args) {
            RealSubject subject = new RealSubject();
            Subject proxySubject = (Subject) Proxy.newProxyInstance(subject
                    .getClass().getClassLoader(), subject.getClass()
                    .getInterfaces(), new ProxyHandle(subject));
            proxySubject.request();
            
            //proxySubject.response();
        }
    
    }
    View Code

    从上面的代码页可以看出,一旦接口变了,代理类是不需要做改变的~~

    但是java的动态代理依赖于接口,如果现有代码中没有接口怎么办,岂不是不能使用java的动态代理了??

    怎么破?使用cglib...

  • 相关阅读:
    C#中的委托,匿名方法和Lambda表达式
    Java 8 Lambda表达式探险
    Lambda表达式有何用处?如何使用?
    有参数的程序,可以被调用
    怎样用VB编写.DLL动态链接库文件
    Oracle 存储过程包
    EB(存储单位)
    排序之快速排序(上)
    排序之冒泡排序
    排序之堆排序
  • 原文地址:https://www.cnblogs.com/yejg1212/p/3234377.html
Copyright © 2011-2022 走看看