类加载机制的原理

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相干技术文章或行业资讯,欢送大家关注和转发文章!