jdk动态代理
2014-04-05 20:53
267 查看
看了很多的jdk动态代理文章,都离不开这几个字:接口动态代理。
按照最简单的方式来看,就是在调用一个对象方法前后加一些处理代码,然后我们就很简单的想到编写一个代理类,传入需要代理的对象通过调用代理类的代理方法来实现“前后加一些处理代码”:
public class GoalClass{
public void goalClassMethod(){}
}
public class Proxy{
private GoalClass goalClass;
public GoalClass setGoalClass(GoalClass gc){
this.goalClass=gc;
}
public void proxyGoalClassMethod(){
//方法调用前的处理代码;
..........
//调用方法;
goalClass.goalClassMethod();
//方法调用后的处理代码;
...........
}
}
但是有个问题:不能给每个类都写一个代理类吧。
所以接口代理这个概念就抛出来了,通过实现对接口的代理,那么,所有这个接口的子类也就被代理了;?(这句话。。。。)
通过实现java.lang.reflect.InvocationHandler这个接口的invoke()方法,实现对方法的代理。
但是又一个问题蹦出来了:jvm怎么能识别不同的子类呢?
是通过java.lang.reflect.Proxy来实现的
通过java的ClassLoader来动态加载不同的子类,我们都知道java是解释型语言,所以在编译期间动态分辨出是哪个具体的子类。
具体是通过java.lang.reflect.Proxy.newProxyInstance(load,cl,hadle)来动态生成一个对象的代理。
按照最简单的方式来看,就是在调用一个对象方法前后加一些处理代码,然后我们就很简单的想到编写一个代理类,传入需要代理的对象通过调用代理类的代理方法来实现“前后加一些处理代码”:
public class GoalClass{
public void goalClassMethod(){}
}
public class Proxy{
private GoalClass goalClass;
public GoalClass setGoalClass(GoalClass gc){
this.goalClass=gc;
}
public void proxyGoalClassMethod(){
//方法调用前的处理代码;
..........
//调用方法;
goalClass.goalClassMethod();
//方法调用后的处理代码;
...........
}
}
但是有个问题:不能给每个类都写一个代理类吧。
所以接口代理这个概念就抛出来了,通过实现对接口的代理,那么,所有这个接口的子类也就被代理了;?(这句话。。。。)
通过实现java.lang.reflect.InvocationHandler这个接口的invoke()方法,实现对方法的代理。
但是又一个问题蹦出来了:jvm怎么能识别不同的子类呢?
是通过java.lang.reflect.Proxy来实现的
通过java的ClassLoader来动态加载不同的子类,我们都知道java是解释型语言,所以在编译期间动态分辨出是哪个具体的子类。
具体是通过java.lang.reflect.Proxy.newProxyInstance(load,cl,hadle)来动态生成一个对象的代理。
相关文章推荐
- 为何 JavaBean 要实现 serializable 接口?
- Java先序序列构造二叉树
- java NIO- Selector
- 关于用java创建一个.properties文件,程序结果为空的问题
- 异常javax.servlet.jsp.JspException cannot be resolved
- Java中传递参数的若干问题
- java集合框架总结一
- JDK里的设计模式
- Java编程优化之旅(二) String类型知多少
- java学习笔记--计算器和日历
- Java之Frame
- java 常用日志框架
- Java之Frame
- jdbc pool java连接池技术
- Java JDBC 理论笔记
- 策略模式解析-JAVA类库中TreeSet源码为例
- java多态
- Eclipse maven-archetype-quickstart
- java常见编译错误信息
- java输入输出流