`
MauerSu
  • 浏览: 509394 次
  • 性别: 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反射之动态代理

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

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

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

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

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

    JVM.rar_jvm

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

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

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

    java Proxy 动态代理

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

    JVM从入门到入魔.zip

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

    类加载机制与动态代理的测试题

    ### 类加载机制与动态代理知识点解析 #### 一、选择题知识点详解 ##### 1. 类加载的过程 类加载过程主要包括以下几个步骤: - **加载**(A):这是类加载的第一个阶段,在这个阶段,JVM负责读取类的二进制数据到...

    Java反射技术浅谈.pdf

    反射技术还可以用于实现动态代理、Aspect-Oriented Programming等技术。 反射技术的实现是基于Java的反射机制,即Java的类加载机制。Java的类加载机制可以将类加载到JVM中,并提供了反射机制来访问类的信息。Java的...

Global site tag (gtag.js) - Google Analytics