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. linux shell执行中需要交互输入回车,Yes/NO Y/N

    最近写自动安装脚本遇到redis-server安装的时候,需要输入3个回车,对此尝试无果,最后google比较满意的解决办法: shell 脚本需要交互,比如输入回车,输入YES/NO Y/N之类进行 ...

  2. AutoCad2008 部分快捷键

    编组开关:  Ctrl+Shift+A 查看扩展属性命令: xdlist 加载新的菜单栏命令:menu

  3. jQuery Ajax传递数组到asp.net web api参数为空

    前端: var files = []; files.push({ FileName: "1.jgp", Extension: ".jgp", FileType: ...

  4. WCF use ProtoBuf

    ProtoBuf, 比起xml和json, 传输的数据里面没有自描述标签, 而且是基于二进制的, 所以有着超高的传输效率, 据牛人张善友的描述, 可以替代WCF的自带的编码方案, 效率有极大的提升. ...

  5. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  6. controller错误统一处理--------@ExceptionHandler

    用@RequestBody,@ResponseBody,不费吹灰之力就解决了JSon自动绑定.接着就发现,如果遇到RuntimeException,需要给出一个默认返回JSON 三种方式: 1.当这个 ...

  7. Flask备注三(Context)

    Flask备注三(Context) Flask支持不同的应用场景下,对应不同的local context(本地上下文环境),用来提供当前环境下的资源.lcoal context和全局变量以及局部变量最 ...

  8. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  9. 使用Scala实现文件单词计数

    package com.dtapp.base import scala.io.Source object WCntApp { def main(args: Array[String]) { val f ...

  10. 初识C语言

    C语言是开发iOS软件的基础. 一.C语言简介 1.      简史 1)          C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前主要是用汇编语言写的,它奠定了操作 ...