关于java:关于类的加载机制和反射机制只看这一篇就够了分析的非常详细

5次阅读

共计 3748 个字符,预计需要花费 10 分钟才能阅读完成。

类加载机制的原理

1. 启动 JVM
2. 将须要运行的 class 文件加载到虚拟机内存中
3. 找到主类,开始执行主函数

加载步骤:

1. 先委托父类加载类,如果父类曾经加载,就不须要再次加载,如果父类没有加载,再由本加载器加载
2. 解析类门路,将类门路转换成文件门路
3. 通过文件输出流来读取 class 文件,失去字节数组
4. 将字节数组转换成类对象, 对象的类型是 Class 类型

有哪些类加载器

类加载器:ClassLoader
AppClassLoader:利用类加载器,负责加载外围类,加载本人写的类
ExtClassLoader:扩大类加载器,负责加载扩大类库
bootstrap:JVM 内置的加载器
Bootstrap 类加载器是 JVM 的一部分,是由 C ++ 编写的,随着启动虚拟机就会创立一个 bootstrap 类加载器对象

取得 Class 对象的几种形式

1. 通过类名.class

Class c1 = Student.class;

2. 通过对象的 getClass()办法

Class c2 = stu.getClass();

3. 通过类加载器取得 class 对象

ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class c3 = classLoader.loadClass("com.newer.test.Student");

4. 通过 Class.forName()取得 Class 对象;

Class c4 =  Class.forName("com.newer.test.Student");

总代码:
先创立学生类

package com.newer.test;

public class Student {
    private int num;
    private String name;
    private int age;
    public Student(){}
    private Student(int num){this.num = num;}
    public Student(int num,String name,int age){
        this.num = num;
        this.name = name;
        this.age = age;
    }
    public int getNum() {return num;}
    public void setNum(int num) {this.num = num;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.newer.test;

public class MainClass {public static void main(String[] args) throws  Exception{Student stu = new Student();

        // 取得 Student 的 Class 对象

        //1. 通过类名.class
        Class c1 = Student.class;

        //2. 通过对象的 getClass()办法
        Class c2 = stu.getClass();

        //3. 通过类加载器取得 class 对象
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Class c3 = classLoader.loadClass("com.newer.test.Student");

        //4. 通过 Class.forName()取得 Class 对象;
        Class c4 = Class.forName("com.newer.test.Student");

如何通过 Class 对象取得构造方法对象

类的所有的信息都在 Class 对象中
Class 类是反射机制中的外围类

Class c = Class.forName(包名. 类名);

// 加载类,取得类的 Class 对象
Class c = Class.forName("com.newer.test.Student");

1. 取得所有可见的构造方法

//1. 取得所有可见的构造方法
Constructor[] cons= c.getConstructors();

2. 取得所有曾经申明的构造方法

//2. 取得所有曾经申明的构造方法
Constructor[] cons2= c.getDeclaredConstructors();

3. 取得指定的可见的某一个构造方法

//3. 取得指定的可见的某一个构造方法
Constructor cc = c.getConstructor(int.class,String.class,int.class);

4. 从申明的办法中取得指定的构造方法

//4. 从申明的办法中取得指定的构造方法
Constructor cc2 = c.getDeclaredConstructor(int.class);

总代码:
学生类

package com.newer.test;

public class Student {
    private int num;
    private String name;
    private int age;
    public Student(){}
    private Student(int num){this.num = num;}
    public Student(int num,String name,int age){
        this.num = num;
        this.name = name;
        this.age = age;
    }
    public int getNum() {return num;}
    public void setNum(int num) {this.num = num;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.newer.test;

import java.lang.reflect.Constructor;
/**
 * 反射机制动静取得类的信息
 */
public class FanShe {public static void main(String[] args) throws Exception{
        // 加载类,取得类的 Class 对象
        Class c = Class.forName("com.newer.test.Student");
        // 通过 Class 对象取得类的信息
        //1. 取得所有可见的构造方法
        Constructor[] cons= c.getConstructors();
        for (Constructor con:cons){System.out.println(con);
        }
        System.out.println("------------------------");
        //2. 取得所有曾经申明的构造方法
        Constructor[] cons2= c.getDeclaredConstructors();
        for (Constructor con:cons2){System.out.println(con);
        }
        System.out.println("------------------------");
        //3. 取得指定的可见的某一个构造方法
        Constructor cc = c.getConstructor(int.class,String.class,int.class);
        System.out.println(cc);
        System.out.println("------------------------");
        //4. 从申明的办法中取得指定的构造方法
        Constructor cc2 = c.getDeclaredConstructor(int.class);
        System.out.println(cc2);
        System.out.println("------------------------");
      }
}

如何通过构造方法对象实例化

// 通过构造方法对象失去类的实例对象
Object obj = cc.newInstance(123,"zhangsan",20);

拜访公有构造方法:
cc2.setAccessible(true);

// 通过公有构造方法实例化对象
// 设置容许拜访公有构造方法
cc2.setAccessible(true);
Object obj2 =  cc2.newInstance(22);

最初

感激你看到这里,看完有什么的不懂的能够在评论区问我,感觉文章对你有帮忙的话记得给我点个赞,每天都会分享 java 相干技术文章或行业资讯,欢送大家关注和转发文章!

正文完
 0