java的反射和反编译机制介绍

《JAVA啃骨头》之 Java SE 章节

java的反射和反编译机制介绍

一 、什么是java反射机制

  • JAVA反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法,都能够调用它的任意方法和属性,这种动态获取信息和动态调用对象方法的功能称之为java语言的反射机制。简而言之,java反射机制的作用是用于操作二进制代码,这种操作包括读取和修改,类似于黑客。
  • 反射机制的出现,让原本“静态”的过程“动态化”。

二、引入“java的动态语言”

  • 动态语言是指在程序在运行的时候,允许改变程序结构或者变量类型,这种语言被称为“动态语言”。
  • java不是动态语言,但是却有一个动态相关机制:Feflection,即:反射机制。他的作用直白的说就是:我们可以在运行时加载、使用编译期间未编译的class。
  • 具体的讲,就是我们在平时在生成对象时候,是通过new Class()的方法来创建一个对象的,即我们先知道这个类是什么,然后根据类来实例化对象,再去调用方法等等,即,先生成对象,我们再去调用。而反射机制则先跳过编译阶段,先生成,后编译。

三、 图解反射机制的原理

在这里插入图片描述

四、 反编译机制和反射机制的关系

  • 编译是指javac.exe 把java源文件编译成字节码文件(不是纯粹的二进制文件 ),所以,反编译是指把字节码文件变成java源文件。
  • Reflection中的方法包括对字节码的修改和读取。个人认为,反射机制的作用一般是修改字节码文件,从而创建一个新的对象。而对字节码的读取 一般被称为反编译机制。
  • 反编译机制又被称为译逆机制,常用的反编译工具:DJ Java Decompiler
    下载链接:link

五、java.lang.reflect 包中重点方法的掌握

  • 反射机制的方法在哪个包下?

    java.lang.reflect.
    
  • 反射机制的方法在这个包的哪个类之下?

     java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
    
     java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
    
     java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
    
     java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量:方法体之外)。
    

    java.lang.Class 不在 java.lang.reflect 之下
    这些都是类名,下面有很多方法,类名要做到 “见名知意”
    包全部小写,若有类,则类的名字首字母大写

  • 通过反射机制获取类的的三种方式:

    第一种:Class c = Class.forName("完整类名带包名");
    第二种:Class c = 对象.getClass();
    第三种:Class c = 任何类型.class;
    
  • 通过反射机制获取类进行对象的实例化:

    Object obj = c.newInstance();
    

    重点是:newInstance() 这个方法会调用object所在类的无参数构造方法,完成对象的创建,必须保证无参构造是存在的!建议手动给出

  • 通过反射机制给实例对象赋值,并且读取:

    一、 获取no属性(根据属性的名称来获取Field)

    Field noFiled = studentClass.getDeclaredField("no");
    

    二、给obj对象(Student对象)的no属性赋值2222

    noFiled.set(obj, 22222); 
    

    三、读取属性的值,两个要素:获取obj对象的no属性的值。

     System.out.println(noFiled.get(obj)); 
    
  • 通过反射机制调用构造方法实例化java对象:

    一、先获取到这个有参数的构造方法

     Constructor con = c.getDeclaredConstructor(int.class, String.class, String.class,boolean.class);
    

    二、调用构造方法new对象

    Object newObj = con.newInstance(110, "jackson", "1990-10-11", true);
    

    三、输出对象

    System.out.println(newObj);
    

六、反射机制的使用场景:

  • 在平时的编程中,反射机制及基本不会使用到。但是高级框架很多会使用到,高级框架一般情况下是要在配置文件的进行数据的操作,而框架的底层原理就是是使用了反射机制。
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页