理解动态代理的实现过程
来源:互联网 发布:linux vim颜色主题 编辑:程序博客网 时间:2024/05/17 08:10
我在api文档中的java.lang.reflect.proxy中看到一个简明易懂的小例子可以很好吧帮助我理解动态代理类生成的过程,我把它完善了一下然后再eclipse上做试验。
import java.lang.reflect.*;
public class t2{
public static void main(String[] args)throws Exception{
InvocationHandler handler = new MyInvocationHandler();//调用处理程序的实例
Class proxyClass = Proxy.getProxyClass(foo.class.getClassLoader(),foo.class);//这里就在运行过程中得到一个类,要得到//一个类就需要类加载器和这个所要实现的接口,
//把他俩放在参数里就行了,在原例子中foo.class 放在一个new//Class[]{foo.class}数组中,这样就可以
//实现多个接口了
System.out.println(proxyClass.getName()+" "+proxyClass.getSuperclass());
for(Method m:proxyClass.getMethods()){
System.out.println("Methods"+" "+m);//受到好奇心的驱使,在这里我试着打印出代理类中的方法。
}
foo f = (foo)proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);//拿到构造方法,创建实例
f.dosomething();
}
}
interface foo {
void dosomething();
}
class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[]args)
throws Throwable {
System.out.println("HelloWorld");
return null;
}
}
现在我理解“接口加反射什么都能做”,这就话好像说的就是动态代理类。不需要编辑类,通过定义接口和使用反射的方法在程序执行的时候生成类。
下面是运行结果
$Proxy0 class java.lang.reflect.Proxy Methods public final void $Proxy0.dosomething() Methods public final boolean $Proxy0.equals(java.lang.Object) Methods public final java.lang.String $Proxy0.toString() Methods public final int $Proxy0.hashCode() Methods public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class) Methods public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException Methods public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException Methods public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException Methods public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException Methods public final void java.lang.Object.wait() throws java.lang.InterruptedException Methods public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException Methods public final native java.lang.Class java.lang.Object.getClass() Methods public final native void java.lang.Object.notify() Methods public final native void java.lang.Object.notifyAll() Hello World
- 理解动态代理的实现过程
- Java 动态代理的理解与Cglib动态代理实现
- 深入理解 jdk 动态代理的实现
- JDK的动态代理实现原理理解
- 动态代理的理解
- 动态代理的理解
- 源码角度理解JDK动态代理的实现原理
- Java实现动态代理(cglib,aop)的过程
- 代理模式的再理解--动态代理
- 静态代理和动态代理的理解
- 动态代理的通俗理解
- 动态代理的实现
- 动态代理的实现
- 动态代理的实现
- Java动态代理模式理解和实现
- 浅析动态代理类实现过程
- 浅析动态代理类实现过程
- JAVA动态代理用法与实现过程
- ASP .NET 中的身份验证:.NET 安全性指导
- Android多媒体学习五:调用Android自带的播放器播放Audio
- itoa与atoi 2011.04.18
- Linux内存管理(下)
- rar简单打包详细方法
- 理解动态代理的实现过程
- MYSQL中如何 高效获取新插入的流水记录
- 思念不会再有相见
- Ext 4 概述(一)
- 求一个unsigned int 数的二进制表示中有多少个1?
- Tomcat 严重: IOException while loading persisted sessions: java.io.EOFException
- FTP协议的命令与返回码
- 利用請求状态来提示信息
- zenoss入门