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
java 动态代理示例,带主要注释的更多相关文章
- 【转载】Java 动态代理
Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析 ...
- java动态代理的实现以及原理
1.前言 之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些. 2.动态代理的实现应用到的技术 1.动态编译技术,可以使用Java自 ...
- Java 动态代理作用是什么?
Java 动态代理作用是什么? 1 条评论 分享 默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...
- java动态代理浅析
最近在公司看到了mybatis与spring整合中MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 于是想起了java的动态代理,然后就有了这篇文章 ...
- Java 动态代理
被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...
- [转]java动态代理(JDK和cglib)
转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...
- java动态代理模式
java动态代理机制详解 Spring的核心AOP的原理就是java的动态代理机制. 在java的动态代理机制中,有两个重要的类或接口: 1.InvocationHandler(Interface): ...
- 彻底理解JAVA动态代理
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public ...
- Java动态代理 cglib
代理模式:为某些对象提供代理以实现对这个对象的访问. 对一个对象进行访问控制的原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 一般包括以下组件: 被代理者接口:提供被代理者的访问途径. ...
随机推荐
- Java C# C语言中的占位符
一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...
- XUtils
//HttpUtils实例化对象 HttpUtils http = new HttpUtils(); /* *发送请求send(HttpMethod ...
- java多线程详解(1)-多线程入门
一.多线程的概念 线程概念 线程就是程序中单独顺序的流控制. 线程本身不能运行,它只能用于程序中. 说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境. 进程:操作系统中执行的程序 程序是 ...
- jQuery将悬停效果加到菜单项
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 2-4. Using auto with Functions
在C++14中允许使用type deduction用于函数参数和函数返回值 Return Type Deduction in C++11 #include <iostream> using ...
- ubuntu命令大全
一.文件/文件夹管理 ls 列出当前目录文件(不包括隐含文件) ls -a 列出当前目录文件(包括隐含文件) ls -l 列出当前目录下文件的详细信息 cd .. 回当前目录的上一级目录 cd - 回 ...
- Google Earth API 替换方案
众所周知,GE API将会在15年12月25日结束服务,对于众多采用该API的软件,需要一些替换方案. 例如google map或者cesiumjs http://cesiumjs.org/ 或者尝试 ...
- iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)
我们要申请开发者账号,首先就需要先注册一个苹果的apple id,然后再这个账号的基础上去继续,这个相信大家都知道 这是申请appleid的地址:https://appleid.apple.com/a ...
- iOSview整体上移下移(点击键盘)
首先创建一个textFiled 并实现起代理方法 - (void)textFieldDidBeginEditing:(UITextField *)textField { //设置动画的名字 [UIVi ...
- asp.net(C#) Excel导出类 导出.xls文件
---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft Excel 11.0 Obje ...