源:http://www.educity.cn/it/sun/200901111502051421.htm
评:
动态代理
Sun对动态代理的说明:
一个简单例子代码:
动态代理的内部实现——代码生成:
研究JDK源代码,发现在Proxy的sun实现中调用了sun.misc.ProxyGenerator类的generateProxyClass( proxyName, interfaces)方法,其返回值为byte[]和class文件的内存类型一致。于是做如下试验:
public class ProxyClassFile{
public static void main(String[] args){
String proxyName = "TempProxy";
TempImpl t = new TempImpl("proxy");
Class[] interfaces =t.getClass().getInterfaces();
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
proxyName, interfaces);
File f = new File("classes/TempProxy.class");
try {
FileOutputStream fos = new FileOutputStream(f);
fos.write(proxyClassFile);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
运行该类,到class文件夹下,利用反编译技术,发现原来其采用了代码生产技术:
public interface Temp{
public void Talk();
public void Run();
}
import java.lang.reflect.*;
public final class TempProxy extends Proxy
implements Temp{
private static Method m4;
private static Method m2;
private static Method m0;
private static Method m3;
private static Method m1;
public TempProxy(InvocationHandler invocationhandler) {
super(invocationhandler);
}
public final void Run() {
try {
h.invoke(this, m4, null);
return;
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
}
public final String toString(){
try{
return (String)h.invoke(this, m2, null);
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
return "";
}
public final int hashCode() {
try {
return ((Integer)h.invoke(this, m0, null)).intValue();
}
catch(Error _ex) { }
catch(Throwable throwable){
throw new UndeclaredThrowableException(throwable);
}
return 123;
}
public final void Talk(){
try{
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)h.invoke(this, m1, new Object[] {
obj
})).booleanValue();
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
return false;
}
static{
try{
m4 = Class.forName("Temp").getMethod("Run", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m3 = Class.forName("Temp").getMethod("Talk", 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());
}
catch(ClassNotFoundException classnotfoundexception) {
throw new NoClassDefFoundError(classnotfoundexception.getMessage());
}
}
}
分享到:
相关推荐
本主题将深入探讨JVM技术,特别是反射与动态代理这两个关键特性。 一、JVM技术 1. 类加载机制:JVM通过类加载器(ClassLoader)来加载.class文件,分为启动类加载器、扩展类加载器和应用程序类加载器。类的加载...
### Java反射机制与动态代理 #### 一、Java反射机制 **Java反射机制**是一种强大的功能,它允许我们在运行时动态地访问类的信息并进行操作。这种能力在很多情况下非常有用,比如在开发框架和库时,我们经常需要在...
动态代理是JAVA反射机制的一个重要应用,它允许在运行时动态地创建一个实现特定接口的新类。这通常用于AOP(面向切面编程)中,例如,在不修改原始类的情况下添加额外的行为或监控。 #### 动态代理的实现 在JAVA中,...
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在实际开发中有着广泛的应用。反射机制允许程序在运行时动态地获取类的信息并操作类的对象,而动态代理则提供了一种创建和控制代理对象的方式,...
4. 动态代理:动态代理是反射的一个重要应用场景,它允许在运行时创建一个接口的实现类,这个类是动态生成的,不是在编译期就确定的。动态代理使得我们可以在不修改源代码的前提下,为现有的类添加额外的功能或修改...
这种技术在动态代理中尤为重要,因为它使得在程序执行期间能够创建和操作对象,而无需在编译时知道确切的类信息。动态代理通常用于实现AOP(面向切面编程)或事件监听器等场景,它可以在不修改原始代码的情况下增加...
在Android开发中,反射、注解和动态代理是三个非常重要的高级特性,它们极大地提高了代码的灵活性和可维护性。接下来我们将深入探讨这三个概念以及它们的综合应用。 反射(Reflection)是Java提供的一种机制,允许...
4. **Java JVM技术**: Java虚拟机(JVM)是Java运行时环境的核心,负责解释和执行字节码。理解JVM的工作原理,包括内存模型(堆、栈、方法区等)、垃圾收集机制(新生代、老年代、CMS、G1等)、类加载机制(双亲...
在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助...
4. 理解反射和动态代理:类装载器和运行时数据区是Java反射和动态代理技术的基础,深入理解JVM有助于开发更灵活的代码。 5. 安全编程:了解安全管理器的工作原理,可以帮助开发者编写更安全的代码,防止恶意代码的...
动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有接口的扩展与增强。 在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
最后,笔记可能会涉及到JVM的一些高级特性,如类加载器的自定义、动态类型语言的支持(JIT编译器和 invokedynamic 指令)、以及如何利用JDK动态代理和反射等技术来增强程序的灵活性和可扩展性。 总之,《JVM从入门...
动态代理与静态代理相比,具有更高的灵活性和扩展性。静态代理通常需要为每一个被代理的对象编写一个专门的代理类,而动态代理则可以在运行时动态地生成代理类,无需为每个对象编写代理代码。这样不仅减少了代码量,...