对于Dynamic
Proxy的原理,很多地方都有介绍,里面最神秘的就是JVM会在运行时动态生成一个类,好奇心驱使,想看看这个生成的类的代码是啥样的。于是,跟踪到Proxy.newProxyInstance()中,发现生成代码的关键语句byte[]
ProxyGenerator.generateProxyClass(String proxyname,Class[]
instances),写了段代码来输出那个类文件,并得到反编译的结果
----------IPerson .java-----------
package cn.edu.tju.bme;
public interface IPerson {
public void
insertPerson();
public
String getPersonName();
}
----------TestInvocationHandler.java-----------
package cn.edu.tju.bme;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TestInvocationHandler implements InvocationHandler
{
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable {
// TODO
Auto-generated method stub
return
null;
}
}
------------Main.java-----------
package cn.edu;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import sun.misc.ProxyGenerator;
import cn.edu.tju.bme.IPerson;
import cn.edu.tju.bme.TestInvocationHandler;
public class Main {
public
static void main(String[] args) throws IOException {
String
proxyName = "proxyName";
InvocationHandler handler = new TestInvocationHandler();
byte[]
proxyClassFile
=
ProxyGenerator.generateProxyClass( proxyName, new
Class[]{IPerson.class});
FileOutputStream fos = new FileOutputStream(new
File("D:\\ProxyName.class"));
fos.write(proxyClassFile);
fos.flush();
fos.close();
}
}
---------------------------
反编译生成的ProxyName.class,得到的源文件如下:
----------proxyName.java-----------
import cn.edu.tju.bme.IPerson;
import java.lang.reflect.*;
public final class proxyName extends Proxy
implements
IPerson
{
public
proxyName(InvocationHandler invocationhandler)
{
super(invocationhandler);
}
public final
String toString()
{
try
{
return (String)super.h.invoke(this, m2, null);
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final
int hashCode()
{
try
{
return ((Integer)super.h.invoke(this, m0, null)).intValue();
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final
String getPersonName
()
{
try
{
return (String)super.h.invoke(this, m4, null);
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final
void insertPerson
()
{
try
{
super.h.invoke(this, m3, null);
return;
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
public final
boolean equals(Object obj)
{
try
{
return ((Boolean)super.h.invoke(this, m1, new Object[] {
obj
})).booleanValue();
}
catch(Error _ex) { }
catch(Throwable throwable)
{
throw new UndeclaredThrowableException(throwable);
}
}
private
static Method m2;
private
static Method m0;
private
static Method m4;
private
static Method m3;
private
static Method m1;
static
{
try
{
m2 = Class.forName("java.lang.Object").getMethod("toString", new
Class[0]);
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new
Class[0]);
m4 =
Class.forName("cn.edu.tju.bme.IPerson").getMethod("getPersonName",
new Class[0]);
m3 =
Class.forName("cn.edu.tju.bme.IPerson").getMethod("insertPerson",
new Class[0]);
m1 = Class.forName("java.lang.Object").getMethod("equals", new
Class[] {
Class.forName("java.lang.Object")
});
}
catch(NoSuchMethodException nosuchmethodexception)
{
throw new
NoSuchMethodError(nosuchmethodexception.getMessage());
}
分享到:
相关推荐
package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...
本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...
using Castle.DynamicProxy; public class SimpleSamepleEntity { public virtual string Name { get; set; } public virtual int Age { get; set; } public override string ToString() { return string....
《解决IBatisNET v1.x在.NET 4.0下'Ambiguous match found'问题:Castle.DynamicProxy深度解析》 在.NET开发过程中,框架的选择和兼容性问题是开发者常常面临的挑战。其中,IBatisNET作为一款优秀的数据访问层框架...
Castle框架注入依赖所需dll Version:2.1.0.0
在本示例中,`ChannelFactory` 和 `DynamicProxy` 是两个关键概念,它们与WCF中的动态调用密切相关。 **ChannelFactory** 是WCF客户端编程模型中的一个重要组件。它是一个工厂模式的实现,用于创建与服务契约相匹配...
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
DynamicProxy.zip
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
解决VS报错:未能加载文件或程序集“LinFu.DynamicProxy, Version=1.0.3.14911, Culture=neutral, PublicKeyToken=62a6874124340d6e”或它的某一个依赖项。系统找不到指定的文件。 把该文件放到bin文件夹就好了。
**Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....
动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....
例如,通过MEF加载实现`INotifyDataErrorInfo`接口的验证服务,这些服务可以利用Castle DynamicProxy来拦截和增强视图模型的方法调用,进行数据验证。同时,Caliburn.Micro则负责处理视图和视图模型的交互,提供简单...
动态代理主要由两个核心类组成:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类是用于创建动态代理对象的工厂,而`InvocationHandler`接口则定义了代理对象如何处理方法调用的...
主要写了静态代理、动态代理、还写了URL的使用,其实就是下载的原理了。 动态代理动态代理动态代理动态代理
在Java中,动态代理主要依赖于两个接口:`java.lang.reflect.InvocationHandler` 和 `java.lang.reflect.Proxy`。 `InvocationHandler` 接口定义了一个方法 `invoke()`,该方法会在代理对象的方法被调用时执行。...
动态代理框架源码 /// 说明: /// 在第一次需要用到代理时动态生成代理类,之后的使用均调用已经生成的代理类 /// 规则: /// 1.不能为接口创建代理类代理类 ... /// 2.... /// 3.... /// 1.... /// 2....