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

类加载机制的原理

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

加载步骤:

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

有哪些类加载器

类加载器:ClassLoaderAppClassLoader: 应用类加载器,负责加载核心类,加载自己写的类ExtClassLoader: 扩展类加载器,负责加载扩展类库bootstrap: JVM内置的加载器Bootstrap类加载器是JVM的一部分,是由C++编写的,随着启动虚拟机就会创建一个bootstrap类加载器对象

获得Class对象的几种方式

1.通过类名.class

<code>Class c1 = Student.class; /<code>

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

<code>Class c2 = stu.getClass(); /<code>

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

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

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

<code>Class c4 = Class.forName("com.newer.test.Student"); /<code>

总代码:先创建学生类

<code>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 + '}'; } } /<code>

<code>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"); /<code>

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

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

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

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

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

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

<code>//2.获得所有已经声明的构造方法 Constructor[] cons2= c.getDeclaredConstructors(); /<code>

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

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

4.从声明的方法中获得指定的构造方法

<code>//4.从声明的方法中获得指定的构造方法 Constructor cc2 = c.getDeclaredConstructor(int.class); /<code>

总代码:学生类

<code>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 + '}'; } } /<code>

<code>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("------------------------"); } } /<code>

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

<code>//通过构造方法对象得到类的实例对象 Object obj = cc.newInstance(123,"zhangsan",20); /<code>

访问私有构造方法:cc2.setAccessible(true);

<code>//通过私有构造方法实例化对象 //设置允许访问私有构造方法 cc2.setAccessible(true); Object obj2 = cc2.newInstance(22); /<code>

最后

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