简单了解java中的反射、注解、动态代理相关知识

类加载器

类加载器的作用

加载器是java运行时环境的一部分,负责加载字节码文件,即将磁盘上的某个class文件读取到内存并生成Class的对象

类加载器的分类

启动类加载器

用于加载系统类库**\bin**目录下的calss

扩展类加载器

用于加载扩展类库**\lib\ext**目录下的class

应用程序类加载器

用于加载我们自定义的加载器

获取加载类的方式

来自Class类型获取类加载器的方式

public ClassLoader getClassLoader()//返回类的加载器

示例:

public class TestDemo1 {
   
    @Test
    public void testClassLoader(){
   
        //获取TestDemo1的Class对象
        Class<TestDemo1> demo = TestDemo1.class;

        //获取AppClassLoader类加载器对象
        ClassLoader cl1 = demo.getClassLoader();
        System.out.println(cl1);

        //获取AppClassLoader类加载器的父类扩展类加载器ExtClassLoader
        ClassLoader cl2 = cl1.getParent();
        System.out.println(cl2);

        //获取ExtClassLoader类加载器的父类启动类加载器Bootstrap
        ClassLoader cl3 = cl2.getParent();//null
        System.out.println(cl3);
    }
}

双亲委派机制

工作机制

某个“类加载器”收到类加载的请求,它首先不会尝试自己取加载这个类,而是把请求交给父级类加载

因此,所有的类加载的请求最终都会被传送到顶层的“启动类加载器”中。

如果父级类加载器无法加载这个类,然后子级类加载器再去加载。

使用类加载器加载配置文件的方式

示例步骤:

src下新建一个user.properties文件,并输入:

userName=TG
age=21

创建properties类的集合对象p

使用当前类TestDemo2获取Class对象并调用Class类中的getClassLoader函数

使用类加载器对象调用ClassLoader类中的**InputStream getResourceAsStream(String name)**返回读取指定资源的输入流

public class TestDemo2 {
   
    @Test
    public void testGetResourceAsStream() throws IOException {
   
        //获取类加载器对象
        Class<TestDemo2> cla = TestDemo2.class;
        ClassLoader classLoader = cla.getClassLoader();

        //使用类加载器中的方法,获取src目录下的配置文件
        InputStream is = classLoader.getResourceAsStream("user.properties");

        //创建Properties对象
        Properties prop = new Properties();
        prop.load(is);

        System.out.println(prop);
    }
}

反射

概述

是针对Class对象进行操作,是一种类的解剖技术(.class文件中有:构造方法、成员方法、成员变量),反射就可以获取.class文件中的构造方法、成员方法和成员变量。获取到这些东西有啥用嘞?当我们获取到构造方法时,我们可以创建对象,当我们获取到成员变量时,我们可以进行取值和赋值,当我们获取到成员方法时,我们可以进行方法调用执行。上述这种在运行过程中动态的获取类的信息以及调用类中成分的能力称为java语言的反射机制

反射的关键

反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。

反射获取类对象

  1. 当方法区中创建了.class文件的Class对象后,就可以使用类名.class
Class cls = 类名.class
  1. Class cls = Class.forName(“类的全限定名”)
Class cls = Class.forName("com.mysql.cj.jdbc.Driver");//编写代码时不要求Driver必须存在
  1. 在创建具体对象后,用对象名获取Class对象
Class cls = 对象名.getClass();

示例:

public class TestDemo3 {
   
    //类名.class
    @Test
    public void classTest() {
   
        System.out.println

你可能感兴趣的:(java-study,java,开发语言)