反射机制

反射机制

反射机制有什么用?

​ 通过Java语言中的反射机制可以修改操作字节码文件(可以读和修改字节码文件)

​ 可以操作代码片段

反射机制的相关类在哪个包下?

​ java.lang.reflext.*

反射机制相关的重要的类有哪些?

​ java.lang.Class 代表整个字节码,代表一个类型,代表整个类

​ java.lang.reflect.Constructor 代表字节码中的构造方法字节码,代表类中的构造方法

​ java.lang.reflect.Method 代表字节码中的方法字节码,代表类中的方法

​ java.lang.reflect.Field 代表字节码中的属性字节码,代表类中的成员变量(静态变量和实例变量)

​ java.lang.Class

public class User{
    //Field
    int no;
    
    //Constructor
    public User(){   
    }
    public User(int no){
        this.no = no;
    }
    
    //Method
    public void setNo(int no){
        this.no = no;
    }
    public int getNO(){
        return no;
    }
}

获取class的三种方式

第一种:

Class c = Class.forName("完整类名带包名");

Class.forName()要求:

​ 1.静态方法

​ 2.方法的参数必须是一个字符串

​ 3.字符串需要是一个完整的类名

​ 4.完整类名必须带有包名。java.lang包也不能省略

第二种:java中任何一个对象都有一个方法:getClass()

​ Class c = 对象.getClass();

第三种:java语言中任何一种类型,包括基本数据类型,它都有.class属性

​ Class z = String.class; //z代表String类型

​ Class k = Date.class; //k代表Date类型

​ Class f = int.class; //f代表int类型

​ Class e = double.class; //e代表double类型

关于JDK自带的类加载器:

​ 什么是类加载器?

​ 专门负责加载类的命令/工具

​ JDK自带了三个类加载器:

​ 启动类加载器(父加载器)rt.java

​ 扩展类加载器(母加载器)ext/*.jar

​ 应用类加载器 classpath

​ 假设有这样一段代码:

String s = "abc";

​ 代码在开始执行之前,会将所需要类全部加载到JYM中。

​ 通过类加载器加载,看到以上代码类加载器会找到String.class文件,找到就加载,那么是怎么进行加载的呢?

​ 首先是通过“启动类加载器”加载

​ 注意:启动类加载器专门加载:C:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar

​ rt.jar中都是JDK最核心的类库。

​ 如果通过“启动器加载类”没有加载到,那么会通过“扩展类加载器”加载。

​ 注意:扩展类加载器专门加载:C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext*.jar

​ 如果“扩展类加载器”没有加载到,那么会通过“应用类加载器”加载。

​ 注意:应用类加载器专门加载:classpath中的类。

​ Java中为了保证类加载的安全,使用了双亲委派机制,优先从启动类加载器中加载,这个称为“父”,“父”无法加载到,再从扩展类加载器中加载,这个称为“母”。双亲委派。如果都加载不到,才会考虑从应用类加载器中加载,直到加载到为止。

posted @ 2020-08-01 21:18  努力努力向上爬  阅读(109)  评论(0编辑  收藏  举报