`
MauerSu
  • 浏览: 525627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JVM技术 反射与动态代理

 
阅读更多
源: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技术,特别是反射与动态代理这两个关键特性。 一、JVM技术 1. 类加载机制:JVM通过类加载器(ClassLoader)来加载.class文件,分为启动类加载器、扩展类加载器和应用程序类加载器。类的加载...

    java反射机制与动态代理

    ### Java反射机制与动态代理 #### 一、Java反射机制 **Java反射机制**是一种强大的功能,它允许我们在运行时动态地访问类的信息并进行操作。这种能力在很多情况下非常有用,比如在开发框架和库时,我们经常需要在...

    JAVA的反射机制与动态代理.pdf

    动态代理是JAVA反射机制的一个重要应用,它允许在运行时动态地创建一个实现特定接口的新类。这通常用于AOP(面向切面编程)中,例如,在不修改原始类的情况下添加额外的行为或监控。 #### 动态代理的实现 在JAVA中,...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在实际开发中有着广泛的应用。反射机制允许程序在运行时动态地获取类的信息并操作类的对象,而动态代理则提供了一种创建和控制代理对象的方式,...

    反射&动态代理(核心知识点讲解)

    4. 动态代理:动态代理是反射的一个重要应用场景,它允许在运行时创建一个接口的实现类,这个类是动态生成的,不是在编译期就确定的。动态代理使得我们可以在不修改源代码的前提下,为现有的类添加额外的功能或修改...

    java反射之动态代理

    这种技术在动态代理中尤为重要,因为它使得在程序执行期间能够创建和操作对象,而无需在编译时知道确切的类信息。动态代理通常用于实现AOP(面向切面编程)或事件监听器等场景,它可以在不修改原始代码的情况下增加...

    Android 反射注解与动态代理综合使用详解

    在Android开发中,反射、注解和动态代理是三个非常重要的高级特性,它们极大地提高了代码的灵活性和可维护性。接下来我们将深入探讨这三个概念以及它们的综合应用。 反射(Reflection)是Java提供的一种机制,允许...

    javaStrengthen:Java 高级特性增强。包括多线程增强、Java并发包、Java JMS技术、Java JVM技术、Java动态代理以及反射

    4. **Java JVM技术**: Java虚拟机(JVM)是Java运行时环境的核心,负责解释和执行字节码。理解JVM的工作原理,包括内存模型(堆、栈、方法区等)、垃圾收集机制(新生代、老年代、CMS、G1等)、类加载机制(双亲...

    输出JDK和CGLib动态代理产生的class文件.zip

    在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助...

    JVM.rar_jvm

    4. 理解反射和动态代理:类装载器和运行时数据区是Java反射和动态代理技术的基础,深入理解JVM有助于开发更灵活的代码。 5. 安全编程:了解安全管理器的工作原理,可以帮助开发者编写更安全的代码,防止恶意代码的...

    java Proxy 动态代理

    动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有接口的扩展与增强。 在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

    JVM从入门到入魔.zip

    最后,笔记可能会涉及到JVM的一些高级特性,如类加载器的自定义、动态类型语言的支持(JIT编译器和 invokedynamic 指令)、以及如何利用JDK动态代理和反射等技术来增强程序的灵活性和可扩展性。 总之,《JVM从入门...

    Java中的动态代理:工作原理、实现方法与应用场景

    动态代理与静态代理相比,具有更高的灵活性和扩展性。静态代理通常需要为每一个被代理的对象编写一个专门的代理类,而动态代理则可以在运行时动态地生成代理类,无需为每个对象编写代理代码。这样不仅减少了代码量,...

Global site tag (gtag.js) - Google Analytics