JAVA基础——类加载和反射

JAVA基础——类加载和反射1 类加载 publicclassC publicstatic String args ClassLoaderc ClassLoader getSystemCla

大家好,欢迎来到IT知识分享网。

1.类加载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class ClassLoadTest { 
    public static void main(String[] args) { 
    ClassLoader c1 = ClassLoader.getSystemClassLoader(); System.out.println(c1); ClassLoader c2 = c1.getParent(); System.out.println(c2); System.out.println(c2.getParent()); //Bootstrap一般值为null } } 

2.反射

2.1反射概念

在这里插入图片描述

2.2获取Class类对象

在这里插入图片描述

public class ClassTest { 
    public static void main(String[] args) throws ClassNotFoundException { 
    //通过class属性获取类文件 Class<Student> c1 = Student.class; System.out.println(c1); System.out.println("---------"); //通过对象的getClass()获得 Student stu = new Student(); Class<? extends Student> c2 = stu.getClass(); System.out.println(c1==c2); System.out.println("---------"); //调用Class类的静态方法forName(),给出要的类的全路径 Class<?> c3 = Class.forName("com.test812.Student"); System.out.println(c1==c3); } } 

2.3反射获取类方法并使用

2.3.1反射获取类构造方法

在这里插入图片描述

获取构造函数的数组

public class ReflecGetCon { 
    public static void main(String[] args) throws ClassNotFoundException{ 
    Class<?> c1 = Class.forName("com.test812.Student"); //获取到公共的构造方法数组 Constructor[] Con1 = c1.getConstructors(); //获取到私有和默认的构造方法数组 Constructor[] con2 = c1.getDeclaredConstructors(); } } 

获取指定构造函数,并利用反射创建对象

public class ReflecGetCon1 { 
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException { 
    Class<?> c1 = Class.forName("com.test812.Student"); //Constructor类提供了一个类的单个构造函数的信息和访问权限 //获取到指定的公共构造方法,参数表示你要获取到的构造方法的参数的个数和类型 Constructor<?> con3 = c1.getConstructor();//这里指定的是无参构造方法 //通过构造方法对象,利用提供的newInstance创建对象,这里是构造方法的反射 Object obj = con3.newInstance(); //获取到所有的构造方法数组 //Constructor con24 = c1.getDeclaredConstructor(); } } 

获取带参数的构造函数,并利用反射创建对象

public class ReflecgetCon2 { 
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException { 
    Class<?> s = Class.forName("com.test812.Student"); //获取带参数的公共构造类 Constructor<?> con = s.getConstructor(String.class, int.class); //利用Constructor的newInstance方法创建对象 Object obj = con.newInstance("Bala",22); } } 

暴力反射:一般不能非本类中用私有方法,但通过setAccessible可暴力反射,取消访问检查

public class ReflecgetCon2 { 
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException { 
    Class<?> s = Class.forName("com.test812.Student"); //获取带参数的公共构造类 Constructor<?> con = s.getDeclaredConstructor(String.class, int.class); con.setAccessible(true); //利用Constructor的newInstance方法创建对象 Object obj = con.newInstance("Bala",22); } } 

2.3.2反射获取类的成员变量

获取成员变量的数组或者单个成员变量
在这里插入图片描述

public class ReflecgetVar { 
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException { 
    Class<?> con = Class.forName("com.test812.Student"); //获取成员变量的数组 //Field[] f1 = con.getFields();//获取公共的成员变量数组 //Field[] f2 = con.getDeclaredFields();//获取所有的成员变量数组 //用反射创建对象 Constructor<?> c = con.getConstructor(); Object obj = c.newInstance(); //获取具体公共的成员变量,提供成员变量的名称 Field f3 = con.getField("address"); //调用Field的方法给成员变量赋值 f3.set(obj,"中国"); //获取具体任意的成员变量,提供成员变量的名称 Field f4 = con.getDeclaredField("name"); //为私有变量时,要取消访问检查 f4.setAccessible(true); //调用Field的方法给成员变量赋值 f4.set(obj,"Bala"); } } 

2.3.2反射获取成员方法

在这里插入图片描述
在这里插入图片描述
调用私有的时候,要取消访问检查
在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151890.html

(0)
上一篇 2025-03-11 14:15
下一篇 2025-03-11 14:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信