java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)
动态代理属于Java反射的一种。
当我们得到一个对象,想动态的为其一些方法每次被调用前后追加一些操作时,我们将会用到java动态代理。
下边上代码:
首先定义一个接口:
package com.liuyx;
public interface Itf {
public abstract void printMe();
public abstract void printSth(String me);
}
接着是它的实现:
package com.liuyx;
public class Cls implements Itf {
@Override
public void printMe() {
System.out.println("I'm Cls!");
}
@Override
public void printSth(String str) {
System.out.println(str);
}
}
我们的目的就是通过动态代理技术,在Cls这个类的对象的两个方法执行前后,加上一些打印操作。
现在我们实现一个InvocationHandler,把我们想要通过代理者给被代理者追加的操作都写在invoke方法里面:
package com.liuyx; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class StandardInvocation implements InvocationHandler { private Object obj; StandardInvocation(Object obj){
this.obj=obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before method excute!");
Object result = method.invoke(obj, args);
System.out.println("after method excute!");
return result;
} }
首先、这里面有一个obj,这个obj是必须的,我们既然要做代理,我们必须知道我们是给谁做代理,这里的obj就是被代理者。
动态代理说到底也是代理,代理模式里就要求有一个被代理者。
然后是invoke的三个参数、第一个参数就是代理者,如果你想对代理者做一些操作可以使用这个参数;第二个就是被执行的方法,第三个是执行该方法所需的参数。
当你执行代理者的某个方法的时候,最后跑的都是invoke方法。
然后是用法:
public static void main(String[] args) {
//创建一个被代理者
Cls c = new Cls();
//创建一个InvocationHandler,描述我们希望代理者执行哪些操作
InvocationHandler i = new StandardInvocation(c);
//通过刚才创建的InvocationHandler,创建真正的代理者。第一个参数是类加载器,第二个参数是这个代理者实现哪些接口
Itf pxy = (Itf) Proxy.newProxyInstance(Cls.class.getClassLoader(), new Class[] { Itf.class }, i);
pxy.printSth("Hi");
}
pxy就是c的代理者。
最后来一个稍微改进的写法:
package com.liuyx; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class InvocationHandlerTest implements InvocationHandler { private Object target; Object bind(Object i) {
target = i;
Object warpedItf;
warpedItf = Proxy.newProxyInstance(target.getClass().getClassLoader(), i.getClass().getInterfaces(), this);
return warpedItf;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before method excute!");
method.invoke(target, args);
System.out.println("after method excute!");
return null;
} public static void main(String[] args) {
Cls c = new Cls();
InvocationHandlerTest pxy = new InvocationHandlerTest();
Itf itf = (Itf)pxy.bind(c);
itf.printSth("Hello");
} }
java动态代理有一定局限性,需要定义至少一个接口,使用cglib则不必如此。
java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)的更多相关文章
- java 动态代理范例 InvocationHandler与Proxy
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxy ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- Java动态代理之InvocationHandler最简单的入门教程
网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章.其实这些概念没有那么复杂.现在咱们通过一个最简单的例子认识什么是InvocationHandl ...
- 关于java动态代理模式
1. 动态代理 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联. 动态代理主要用到java.lang.reflect包中的两个类,Invocation ...
- java动态代理模式
java动态代理机制详解 Spring的核心AOP的原理就是java的动态代理机制. 在java的动态代理机制中,有两个重要的类或接口: 1.InvocationHandler(Interface): ...
- java 动态代理模式(jdk和cglib)
package proxy.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Met ...
- 深度模拟java动态代理实现机制系类之三
这里的内容就比较复杂了,要实现的是对任意的接口,对任意指定的方法,以及对任意指定的代理类型进行代理,就更真实的模拟出java虚拟机的动态代理机制 罗列一下这里涉及的类.接口之间的关系,方便大家学习.1 ...
- Java动态代理模式浅析
Java代理设计模式 - 静态代理 Java中的动态代理 - 调用处理器 代理设计模式的UML图: 我将首先介绍Java中的各种代理实现方法 Java代理设计模式 - 静态代理 这个例子非常简单,只有 ...
- Java 动态代理模式浅析
目录 Java代理设计模式 - 静态代理 静态代理的优点 静态代理的缺点 Java中的动态代理 - 调用处理器 主要笔记: 动态代理类的限制 代理设计模式的UML图: 我将首先介绍Java中的各种代理 ...
随机推荐
- 洛谷P4009 汽车加油行驶问题
题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...
- nginx hello模块代码
// ngx_http_mytest_module.c #include "ngx_core.h" #include "ngx_string.h" #inclu ...
- [转]Eclipse 项目转移到Android Studio遇到的问题
1.Android Studio直接导入项目是copy原项目的,无法纳入代码管控 解决方案: 英文地址:http://developer.android.com/sdk/installing/migr ...
- [转]Android中常用适配器及定义自己的适配器
一,适配器. 顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示.可以看作是界面数据绑定的一种理解.它所操纵的数据一般都是一些比较复杂的数据,如数组,链表, 数据库,集合等.适配器就像 ...
- Codeforces Beta Round #7 A. Kalevitch and Chess 水题
A. Kalevitch and Chess 题目连接: http://www.codeforces.com/contest/7/problem/A Description A famous Berl ...
- CDOJ 1288 旅游的Final柱 构造题
旅游的Final柱 题目连接: http://acm.uestc.edu.cn/#/problem/show/1288 Description 柱神要去打Final啦~(≧▽≦)/~啦啦啦 柱神来到了 ...
- CDOJ 842 天下归晋 树状数组
天下归晋 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/842 Descrip ...
- HDU 4669 Mutiples on a circle (2013多校7 1004题)
Mutiples on a circle Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- Model工具
Sybase PowerDesigner - 一个高端数据建模工具.你可以下载一个45天试用版. ERWin - 一个高端数据建模工具.可下载试用版. Rational Rose Enterprise ...
- 制作Java安装程序
这个工具利用 ANT 来制作在 Windows, MacOS X, Unix 平台上可执行的文件,比如 exe,zip,jar.ROXES ANT Tasks 基于 GPL 发布. http://ww ...