zoukankan      html  css  js  c++  java
  • java 动态代理示例,带主要注释

    Java proxy是基于反射,仅仅支持基于接口的动态代理.

    java 动态代理是一切架构的基础,必须了解。 废话少说,先上代码获得感性认识。

    示例代码有主要注释.

    接口:

    public interface Subject {
    String hello(String name);
    void say();
    }

    接口实现:
    public class ImpSubject implements Subject {
    @Override
    public String hello(String name){
    return String.format("Hello %s", name);
    }

    @Override
    public void say(){
    System.out.println(this.getClass().getName());
    }
    }

    动态代理方法调用接口:
    //InvocationHandler是自动生成的代理类在调用方法时自动触发的回调接口. 仅仅有一个invocke方法, 可以在这个方法里做各种事情,比如过滤,拦截等等。
    public class MyInvocationHandler implements InvocationHandler {
    private Subject subject;
    public MyInvocationHandler(Subject subject){
    this.subject = subject;
    }
    //object 是代理类实力,method是调用代理实力方法,args是方法参数(无参数则为null)
    //可以委托给被代理的实力对象,也可以不委托给被代理对象。
    @Override
    public Object invoke(Object object, Method method, Object [] args)throws Throwable{

    System.out.println(method.getName());
    System.out.println(object.getClass().getName());
    System.out.println(method.invoke(subject, args));
    return Arrays.toString(args);
    }
    }

    客户端测试代码:
    public class Main {

    public static void main(String[] args) {
    Subject subject = new ImpSubject();
    InvocationHandler invocationHandler = new MyInvocationHandler(subject);
    //Proxy 提供了自动在jvm运行时生成代理类的功能。
    原理为:根据第一个参数classloader加载自动生成的代理class, 代理class会自动生成第二个参数提供的所有接口, 在调用代理类方法时,会回调第三个参数Invocationhandler接口, 实现代理.
    Subject proxy = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(), new Class<?>[]{Subject.class}, invocationHandler);
    System.out.println(proxy.hello("java"));
    System.out.println(proxy.getClass().getName());

    proxy.say();
    }
    }

    输出:

    hello
    com.sun.proxy.$Proxy0
    Hello java
    [java]
    com.sun.proxy.$Proxy0
    say
    com.sun.proxy.$Proxy0
    proxy.ImpSubject
    null

  • 相关阅读:
    思考题
    对敏捷开发的见解
    Code Review(自评)
    求数组最大子数组和
    [ASP.NET]在虚拟目录中禁止web.config继承IIS根目录的web.config的配置
    客户的真实需求
    利用using和try/finally語句來清理資源.
    《代码整洁之道》简单总结
    ASP.NET页面级别的事
    根据DIV移动生成图片
  • 原文地址:https://www.cnblogs.com/tulianghui/p/5890967.html
Copyright © 2011-2022 走看看