《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);
六、反射机制的使用场景:
- 在平时的编程中,反射机制及基本不会使用到。但是高级框架很多会使用到,高级框架一般情况下是要在配置文件的进行数据的操作,而框架的底层原理就是是使用了反射机制。