一、反射的概述
在JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;动态获取的信息以及动态调用对象的方法。
要想对一个类操作,首先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
反射就是把java类中的各种成分映射成一个个的Java对象
在一个类中有成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射机制常用的类:
Java.lang.Class;//类的Class对象
Java.lang.reflect.Constructor;//类的构造器
Java.lang.reflect.Field;//;类的属性
Java.lang.reflect.Method;//类的方法
Java.lang.reflect.Modifier;//类的修饰符
反射的优缺点:
优点:使用反射,我们就可以在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
获取Class的几种方式
//1 通过对象获得Cass对象
Student s = new Student();
Class c1 = s.getClass();
System.out.println(c1);
//2 通过forname来获得
Class c2 = Class.forName("RefletionTest.Student");
System.out.println(c2);
//3 通过类名.class获得
Class c3 = Student.class;
System.out.println(c3);
//基本内置类型的包装类有一个TYPE属性
Class<Integer> C4 = Integer.TYPE;
System.out.println(C4);
二、类的加载
加载:将class文件字节码内容加载到内存中,并把这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的Java.lang.Class对象。
链接:将Java类的二进制代码合并到JVM的运行状态之中的过程。
1)确保加载类要符合JVM的规范。
2)类变量(static)分配内存设置默认初始值,这些内存将在方法区进行分配。
3)JVM常量池的符合引用(常量名)替换为直接引用(地址)的过程。
初始化:
1)执行类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块之中的语句合并产生。
2)当初始化一个类的时候,如果发现其超类还没初始化,则先给超类进行初始化。
3)JVM保证一个类的()方法在多线程环境中被正确的加锁和同步。
参考博客:https://blog.csdn.net/sinat_38259539/article/details/71799078