Java动态代理
2016-06-28 17:51
465 查看
今天看了一下Java的动态代码,先不说Java设计模式中的动态代理模式,本文就Java中的代理类,简单说一下,帮助理解一下,希望支持!
先看个动态代理的使用例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public interface Ia {
public void print();
}
public class IaImpl implements Ia {
public void print() {
System.out.println("IaImpl");
}
}
public static void main(String[] args) {
final Object obj = new TestProxy().new IaImpl();
Ia instance = (Ia) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { Ia.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke被调用");
return method.invoke(obj, null);
}
});
instance.print();// 调用这个方法的时候也调用了invoke方法
System.out.println("instance是哪个类的对象?——" + instance.getClass().getName());
}
}
有时间大家会产生疑问 :invoke()方法是 怎么执行的?这里给解释一下(参考《深入理解JVM》中第9章的部分),由最后一个输出语句,我们可知,instance对象是代理类“Proxy”的class文件,反编译会得到:
..................
public final void print() throws{
try{
this.h.invoke(this, m2, null); //调用invoke方法
return;
}catch{
..................
}
}
.....................
先看个动态代理的使用例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public interface Ia {
public void print();
}
public class IaImpl implements Ia {
public void print() {
System.out.println("IaImpl");
}
}
public static void main(String[] args) {
final Object obj = new TestProxy().new IaImpl();
Ia instance = (Ia) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { Ia.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke被调用");
return method.invoke(obj, null);
}
});
instance.print();// 调用这个方法的时候也调用了invoke方法
System.out.println("instance是哪个类的对象?——" + instance.getClass().getName());
}
}
输出结果: invoke被调用 IaImpl instance是哪个类的对象?——com.sun.proxy.$Proxy0
有时间大家会产生疑问 :invoke()方法是 怎么执行的?这里给解释一下(参考《深入理解JVM》中第9章的部分),由最后一个输出语句,我们可知,instance对象是代理类“Proxy”的class文件,反编译会得到:
..................
public final void print() throws{
try{
this.h.invoke(this, m2, null); //调用invoke方法
return;
}catch{
..................
}
}
.....................
相关文章推荐
- 搭建rtmp直播流服务之2:使用java实现ffmpeg命令接口化调用(用java执行ffmpeg命令)
- 深入理解Java的接口和抽象类
- Spring Boot新模块devtools
- Java设计模式 -- 观察者模式
- Struts2拦截器权限学习心得
- Eclipse导出doc文档以及编码 GBK 的不可映射字符
- Arrays.asList()和Collections.addAll()的性能比较
- spring spel表达式语言
- spring boot 不同的环境使用不同的配置
- java IO之文件输入输出流
- 构建自己的Java Web框架(三)之JAVA反射机制
- Java内部类和外部类互相访问问题
- Java设置session超时(失效)的三种方式
- jdk1.8 ThreadPoolExecutor实现机制分析
- eclipse转成Android studio过程中遇到的问题
- spring boot 静态页面展示
- MyEclipse for mac retina屏模糊的问题
- 一个分布式Java Web Session
- eclipse一些设置方法
- Spring整合开发示例(分别与JDBC、Hibernate、Struts整合)