zoukankan      html  css  js  c++  java
  • 杂记(一)————关于反射的一些有意思的东西

         今天,下午在和朋友聊天的时候,聊起了反射这个话题。我们就从下面这个段简单的代码开始吧。

    这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9。事实也是如此: 

            朋友这个时候就提出一个问题,你看在代码里面有一个aa();你有什么办法,实现这个aa函数,让输出结果不是这个样子的(当然 异常不算)。朋友继续说,你看一下Integer这个里面的实现。

     

        可以知道的是,Integer 会有一个Cache ,我们要做的,就是修改这个Cache里面的值。在知道原理之后,我们就可以开始动手实现了,具体代码如下:

     

     1 private static void aa() {
     2         try {
     3             // 获取类
     4             Class<?> clazz = Class.forName("java.lang.Integer$IntegerCache");
     5 
     6             // 获取cache成员变量
     7             Field field = clazz.getDeclaredField("cache");
     8             field.setAccessible(true);
     9             Integer[] cache = (Integer[]) field.get(clazz);
    10 
    11             // Rewrite the Integer cache
    12             for (int i = 0; i < cache.length; i++) {
    13                 cache[i] = new Integer(10+i);
    14             }
    15         } catch (Exception e) {
    16             // TODO: handle exception
    17         }

    补全这部分代码之后,我们再执行看看结果:

               

    这样就完成了对输出结果的改变。果然是很有意思,只要了解得够多,就足以改变自己的认识。

             那回到最开始的问题:什么是反射呢?

             JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
            JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
    从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。
    换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
            这里引述的是百度百科的解释。就是动态的,在运行中的时候去处理之前已经写好的代码,甚至是引用的包。这样就提供了很多的灵活性,让业务实现的思路更为开阔。
    后来我们又聊到了 ASM [1],还有cglib(Code Generation Library)。谈到这两者的应用时,最好的例子 便是Spring的core包里面的一些内容:
             
     等过段时间,把ASM 和cglib  摸清楚再写文章详细说一说,今天就先到这里了。
     
     
     
    _______________________________________________________________________________
    [1] (http://asm.ow2.org/,ASM 是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类,快得不要不要的)
     
     
     
  • 相关阅读:
    return 与 exit() 的区别
    RtlInitUnicodeString
    计算机网络 学习笔记-概论
    STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
    STM32学习笔记(四) RCC外设的学习和理解
    简单RTOS学习(一) uc/os-II 工程模板建立
    web前端学习(一) html+js实现文本框背景及只读属性修改
    TCP/IP协议学习(一) LWIP实现网络远程IAP下载更新
    STM32学习笔记(三) STM32的GPIO的深入学习
    STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
  • 原文地址:https://www.cnblogs.com/iceworld520/p/7061197.html
Copyright © 2011-2022 走看看