反射这门技术在说之前首先来介绍一下动态语言和静态语言
动态语言:在服务器运行的期间可以改变其结构的语言,在运行时代码可以根据某些条件来改变自身的结构,我们目前学习到的有JS和JQuery类库
静态语言:C、C++、Java这些在运行时结构不可改变的语言,就称之为静态语言
而反射(Reflection)就被视为动态语言的关键,反射机制可以让程序在执行期间借助反射的API来获取类的内部信息,直接可以操作对象的内部属性和方法
一般使用对象:调用构造器——>>>new实例化对象
反射:通过实例化对象——>>>getClass()方法——>>>得到完整的包类名称
反射机制和类的封装机制不冲突,类的封装机制会不让你调用私有方法,让你调用公有方法,因为他会在Public方法里面写好逻辑和生成私有的信息返回给你,而反射机制只是说明了你可以用反射机制直接获取类的私有属性和私有方法。
在使用反射之前,需要学习Class的一些相关知识,没有Class的执行对象就无法进行后续的工作。
类的加载过程:javac.exe编译java文件,生成一个或多个字节码文件。java.exe解释运行字节码文件,把class文件加载到内存的时候就叫类的加载。加载到内存中的类称之为运行时类
就作为一个class的实例。比如:Class class1 = Person.class(Person是我自定义的一个类),换句话说,一个Class对象就对应一个运行时类
不仅仅是类可以作为Class的一个实例,外部类,内部类、接口、数组、枚举、注解、基本数据类型、void都可以作为Class类的一个实例化对象,比如(int .class)甚至Class本身也可以。
数组只要维度一样,得到的Class实例化对象也就相同,维度不同就不一样。
以下是有关类的加载的详细过程(了解就好,打字就太累了QAQ)
类加载器的作用就是把类的字节码文件装载进内存的。引导类加载器无法获取,引导类加载器用于加载类的核心类库,比如String.
扩展类加载器适用于jar包(打包的class字节码文件)、系统类加载器用于自定义类的加载到内存。
总结:Class类用来加载字节码文件,然后链接、最后初始化。而类加载器只是先把字节码文件加载到内存之中。
获取Class类对象(对应运行时类)的方法有:1、类名.class 2、类的实例化对象.getClass() 3、Class.forName("自定义类的相对路径") 4、当前文件类名.class.getClassLoader().loadClass("自定义类的相对路径")
clazz.newInstance()可以返回一个运行时类的对象(比如Person类,使用这个方法的前提是运行时类及其父类要有午餐构造方法,new一个对象的方法只有通过构造器来实现,所以newInstance方法也是间接用到了无参构造器)
标签:总结,反射,对象,Class,实例,JavaSe,class,加载 From: https://www.cnblogs.com/laohei114514/p/16955133.html