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

java 动态代理示例,带主要注释的更多相关文章

  1. 【转载】Java 动态代理

    Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析 ...

  2. java动态代理的实现以及原理

    1.前言 之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些. 2.动态代理的实现应用到的技术 1.动态编译技术,可以使用Java自 ...

  3. Java 动态代理作用是什么?

    Java 动态代理作用是什么?   1 条评论 分享   默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...

  4. java动态代理浅析

    最近在公司看到了mybatis与spring整合中MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 于是想起了java的动态代理,然后就有了这篇文章 ...

  5. Java 动态代理

    被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...

  6. [转]java动态代理(JDK和cglib)

    转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...

  7. java动态代理模式

    java动态代理机制详解 Spring的核心AOP的原理就是java的动态代理机制. 在java的动态代理机制中,有两个重要的类或接口: 1.InvocationHandler(Interface): ...

  8. 彻底理解JAVA动态代理

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public ...

  9. Java动态代理 cglib

    代理模式:为某些对象提供代理以实现对这个对象的访问. 对一个对象进行访问控制的原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 一般包括以下组件: 被代理者接口:提供被代理者的访问途径. ...

随机推荐

  1. 《Reactive_MircService_Architecture》 脑图

    Reactive_MircService_Architecture Lightbend CTO的50页的小册子,对响应式系统以及微服务架构介绍非常全面,整理了一个脑图来先.

  2. 联系人按照A~~~Z排列

    // 01 创建可变字典,存储每一个key对应的数据列表 NSMutableDictionary *nationWithCodeDicList = [NSMutableDictionary dicti ...

  3. DOM事件机制进一步理解

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. (转)jquery easyui treegrid使用小结 (主要讲的是如何编辑easyui中的行信息包括添加 下拉列表等)

    在实际应用中可能会碰到不同的需求,比如会根据每行不同的参数或属性设置来设置同列不同的editor类型,这时原有的例子就显的有点太过简单,不能实现我们的需求,现在应用我在项目中的操作为例,显示下实现同列 ...

  5. Nginx-->基础-->理论-->001:Nginx基本介绍

    一.nginx基本介绍 传统上基于进程或者线程模型架构的web服务通过每进程或者每线程处理并发连接请求,这势必毁在网络和I/O操作时产生阻塞,其另外一个必然结果则是对内存和CPU的利用率低下,产生一个 ...

  6. css之px自动转rem—“懒人”必备

    作为一名前端开发,尤其是在做移动端适配时,rem是我们经常用到的单位,它的好处大家可以自行搜索,网上已经有很多了.但是我们再将设计稿上的px转换成rem时,得手动的去计算,这是一个很耗时.费力的过程, ...

  7. C语言实现 二分查找数组中的Key值(递归和非递归)

    基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...

  8. python 入门学习之环境搭载

    1.常用python 2.7 需要在我的电脑环境变量进行环境搭载 2.用notepad++进行编辑器适配,选择python语言 在输入运行程序名里面输入cmd /k x: & cd " ...

  9. SQL Server 集合处理

    UNION ALL 返回两个结果集中所有的行,返回结果集中会存在重复行 UNION 返回两个结果集中去重的行,返回结果集中无重复行 INTERSECT 返回两个结果集都有的行,返回结果集中无重复行 E ...

  10. (转)linux下cp目录时排除一个或者多个目录的实现方法

    原文链接:http://www.jb51.net/LINUXjishu/88971.html 说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录 ...