JAVA基础——类加载和反射

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值