关于Java动态代理的解析
来源:才华咖 本文已影响2.62W人
来源:才华咖 本文已影响2.62W人
动态代理类是位于ect包下的Interface InvocationHandler。下面小编准备了关于Java动态代理的解析,提供给大家参考!
众所周知,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 = "公用部门";
tln(type);
return type;
}
public void doSelf(String str) {
tln("业务实现类: " + str + " !");
}
public void interrup() {
tln("发呆三分钟!");
}
}
动态代理需要反射,
* 必须要实现InvocationHandler接口
* 能够对所有的方法进行代理
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
/**
* 通过构造方法来设置被代理的对象
* @param obj
*/
public MyInvocationHandler(Object obj) {
= obj;
}
/**
* 动态代理需要反射
*
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
tln("+++++++++++调用业务方法之前做其他事情");
Object returnObject = ke(obj, args);
tln("+++++++++++调用业务方法之前做其他事情");
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 = roxyClass(
lassLoader(), nterfaces());
//建业务逻辑类的动态代理类
Object proxy = onstructor(
new Class[] { s })nstance(
new MyInvocationHandler(new MyselfImpl())); */
//建业务逻辑类的动态代理类
Object proxy = roxyInstance(lassLoader(), nterfaces(), myInvocation);
//业务类自己调用运行代理对象
ActionInterface testIntf = (ActionInterface) proxy;
lf("我要做业务了!");
ype();
InterruupIntf intIntf = (InterruupIntf) proxy;
rrup();
}
}
运行最后一个类的MAIN函数,控制台输出结果如下:
+++++++++++调用业务方法之前做其他事情
业务实现类: 我要做业务了! !
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
公用部门
+++++++++++调用业务方法之前做其他事情
+++++++++++调用业务方法之前做其他事情
发呆三分钟!
+++++++++++调用业务方法之前做其他事情
看到结果了。
JDK的动态代理,对MyselfImpl所有方法都进行了拦截,在调用真正的业务类方法之前之后都插入了代码,这就是JDK的动态代理。其实SPRING的AOP思想的基本原理也是这个,但是它写的比较负责,而且比较优秀。
深入解析hashmap,java实现原理
在Java中执行JavaScript代码
java从代码到运行的步骤解析
Java Ajax jsonp跨域请求详解
关于java内存查看与分析详解
Java中的动态代码编程
java利用反射实现动态代理实现代码
关于java三大框架的基本概念和原理的解析
JAVA认证开源技术:关于Java的对象equals方法
关于计算机二级JAVA考点解析
关于Java动态实现的方法
JAVA认证基础知识:Java文件解压缩示例
关于java 四舍五入使java保留2位小数示例讲解
java与javascript之间json格式数据互转详解
解析Java中volatile关键字
Java脚本动态用法
Javascript和Java语言间的异同比较
Java import以及Java类的搜索路径
Java中的多态用法实例分析
关于对现代礼仪的理解
Java中的JDBC事务解析
Java类库及其组织结构(Java API)
关于Hibernate应用中Java对象的状态类型
Java认证考试知识点:Java时间类的函数
关于《梦的解析》读后感范文参考
关于JavaScript中call()和apply() 的一些理解
关于Java动态代理的解析
JavaScript与java语言的区别
关于Java源代码折行的规则
关于循环的java代码示例
java动态方法调度实例
关于JavaScript中继承的深入理解
理解java中的关键字
JavaScript与Java的区别
Java 2.1 java基本类型的转换和运算符
Java认证考试知识点:JavaSE6的新功能
Java与JavaScript的区别
关于常见变化的成语解析
Java4安卓开发教程之java的变量
php动态生成JavaScript代码