JAVA基础——类加载和反射

JAVA基础——类加载和反射1 类加载 public class ClassLoadTes public static void main String args ClassLoader c1 ClassLoader getSystemCla System out println c1

大家好,我是讯享网,很高兴认识大家。

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反射获取成员方法

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

小讯
上一篇 2025-03-07 20:50
下一篇 2025-03-14 23:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/51889.html