众所周知,JDK的动态代理模式必须实现接口。
以下面的源码为例:
接口一:
public interface ActionInterface {
void doSelf(String str);
String getType();
}
接口二:
public interface InterruupIntf {
void interrup();
}
实现类:
public class MyselfImpl implements ActionInterface, InterruupIntf {
public String getType() {
String type = "公用部门";
System.out.println(type);
return type;
}
public void doSelf(String str) {
System.out.println("业务实现类: " + str + " !");
}
public void interrup() {
System.out.println("发呆三分钟!");
}
}
动态代理需要反射,
* 必须要实现InvocationHandler接口
* 能够对所有的方法进行代理
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
/**
* 通过构造方法来设置被代理的对象
* @param obj
*/
public MyInvocationHandler(Object obj) {
this.obj = obj;
}
/**
* 动态代理需要反射
*
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("+++++++++++调用业务方法之前做其他事情");
Object returnObject = method.invoke(obj, args);
System.out.println("+++++++++++调用业务方法之前做其他事情");
return returnObject;
}
/**
* 测试函数
* 动态代理对所有的代理类都进行了拦截
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws InterruptedException,
IllegalArgumentException, SecurityException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
//实现业务逻辑的类
MyselfImpl muSelf = new MyselfImpl();
//JDK创建的动态逻辑类,调用上面的构造函数注入
MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);
/*
Class<?> proxyClass = Proxy.getProxyClass(
MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces());
//建业务逻辑类的动态代理类
Object proxy = proxyClass.getConstructor(
new Class[] { InvocationHandler.class }).newInstance(
new MyInvocationHandler(new MyselfImpl())); */
//建业务逻辑类的动态代理类
Object proxy = Proxy.newProxyInstance(MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces(), myInvocation);
//业务类自己调用运行代理对象
ActionInterface testIntf = (ActionInterface) proxy;
testIntf.doSelf("我要做业务了!");
testIntf.getType();
InterruupIntf intIntf = (InterruupIntf) proxy;
intIntf.interrup();
}
}
运行最后一个类的MAIN函数,控制台输出结果如下:
+++++++++++调用业务方法之前做其他事情
业务实现类: 我要做业务了! !
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
公用部门
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
发呆三分钟!
+++++++++++调用业务方法之前做其他事情
看到结果了。
JDK的动态代理,对MyselfImpl所有方法都进行了拦截,在调用真正的业务类方法之前之后都插入了代码,这就是JDK的动态代理。其实SPRING的AOP思想的基本原理也是这个,但是它写的复杂多了,而且比较优秀。
分享到:
相关推荐
本片文档剖析了java动态代理的原理。具体请看文档
在学习之前,先提出几个问题,带着问题来看代码: 1.什么是动态代理? 2.为什么使用动态代理? 3.使用它有哪些好处? 4.哪些地方需要动态代理?
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
lotus domino java代理_获取传递值json
主要介绍了Java JDK动态代理实现原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
该思维导图主要讲解了代理模式的具体实现,包括jdk代理,cglib代理。其中jdk代理主要讲解了其具体的实现方式、原理...Cglib代理主要讲解了其原理、与JDK代理的对比、Enhancer源码解析、methodProxy和Fastclass源码等。
代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...
静态代理与动态代理 | 初始进洞(上) 静态代理与动态代理 | 初识进洞(中) JDK源码 JDK探秘 | 详解Integer的享元缓存机制 JDK探险 | 详解Integer的缓存机制 JDK探秘 | ArrayList的扩容机制 JDK探秘 | String究竟在说...
用java阻塞模型开发的oracle tns协议代理,只对tns的最外层协议做了解包处理。对各种子协议,未做处理。仅供参考。再此基础上,如果知道具体的协议,则很容易开发出其他代理。
本文主要介绍了Java连接Oracle数据库和MySQL数据库的步骤解析。具有很好的参考价值,需要的朋友一起来看下吧
用Java写的一个小工具,通过HTML解析技术,从http://www.cnproxy.com读取代理服务器列表,并采用多线程通过代理服务器连接指定网站,测试该服务器是否可用,将可以使用的代理服务器列出以供使用。这个小工具使用了...
将C#代理和lambdas转换为Java接口和lambdas 使用Java泛型转换C#ref参数 当代码中定义事件委托时转换C#事件,或者是System.Action或System.Func代理之一 将所有类型的数组从C#转换成Java 对于继承和接口的所有...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...