代理(静态,JDK,CGLIB)

静态代理

  步骤一:创建抽象主题(接口)

public interface Subject {
    /**
     * 抽象主题
     */
    public void doSome();
}

  步骤二:真实业务代码

public class RealSubject implements Subject {
    /**
     * 真实业务代码
     */
    @Override
    public void doSome() {
        System.out.println("真实业务");
    }
}

  步骤三:测试

public class ProxySubject implements Subject {
private Subject su=new RealSubject();
@Override
public void doSome() {
System.out.println("前");
su.doSome();
System.out.println("后");
}
}

 

 JDK代理

  步骤一:创建抽象主题(接口)

public interface Subject {
    /**
     * 抽象主题
     */
    public void doSome();
}

  步骤二:真实业务代码

public class RealSubject implements Subject {
    /**
     * 真实业务代码
     */
    @Override
    public void doSome() {
        System.out.println("真实业务");
    }
}

  步骤三:测试

public class classsubject {
    public static void main(String[] args) {
        //创建一个静态原始对象
        final Subject subject=new RealSubject();
        Subject subjectProxy=(Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *弥明内部类
             *
             * @param proxy 代理对象
             * @param method    目标代理方法
             * @param args  目标代理方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("嘿嘿,我在前");
            Object invoke= method.invoke(subject,args);
            System.out.println("嘿嘿,我在后");
            return invoke;
            }
        });
        subjectProxy.doSome();
        System.out.println(subject);
        System.out.println(subjectProxy );
    }
}

 

CGLIB代理

  步骤一:代码层

public class Cglib {
    public void Some(){
        System.out.println("代码");
    }
}

  步骤二:测试

public class ServiceCglib {
    public static void main(String[] args) {
        //步骤一:目标对象
        final Cglib cglib=new Cglib();
        //步骤二:生成代理
        Enhancer enhancer=new Enhancer();
        //步骤三:指定需要代理的目标对象木模板
        enhancer.setSuperclass(cglib.getClass());
        //步骤四:实现增强的处理操作
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param o             目标对象
             * @param method        目标方法
             * @param objects       目标方法的参数
             * @param methodProxy   代理目标对象的方法
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("我在前");

                Object invoke = methodProxy.invoke(cglib, objects);

                System.out.println("我在后");
                return invoke;
            }
        });
        //最后一步:创建代理
        Cglib o = (Cglib)enhancer.create();
        o.Some();
    }
}

 

 

posted @ 2019-10-28 16:11  梅川酷子灬  阅读(119)  评论(0编辑  收藏  举报