
文件即对象。
Java反射机制就是上帝视角,可以用来获得一个类的所有信息,对一个对象进行任意的操作,包括修改其私有变量的值。
反射就是调用Class对象的方法。
反射的应用场景
- IDE中对方法的提示
- 开发框架。避免创建具体的类,而是依赖于配置文件,解耦。
写一个极简的“框架”,读取配置文件!
Class字节码文件也是一个File类,因此类加载的一部分过程类似于IO流技术。区别在于Java把Class文件的各个组成部分:属性、构造器、成员方法,都封装成了对象。
获取Class对象
并没有构造器。
- Class . forName(全类名) ,静态方法
- 底层调用了类加载器。
- 类加载器加载class文件,可以看做是Class对象的构造器,他把Class文件变成了Class对象(也就是类初始化阶段)。
- 一个Java对象的创建过程往往包括两个阶段:类初始化阶段 和 类实例化阶段。
- 全类名不能使用双斜杠,只能用 点 分割包名。
- 类名不能加后缀(如java、class),因为是类名!
- 需要搭配读取配置稳健的代码吧,毕竟全类名也不想写死。
- 底层调用了类加载器。
- 类名 . Class,静态方法。
- 对象 . getClass( )。实例方法,说明每个对象的内存中包含指向方法区的引用。
常用Class类的方法
简而言之,就是一个类的每个部分你都可以拿到。
方法里有 Declared 字样,就会获取到所有权限修饰符所修饰的目标。暴力反射需要setAccesible,以便访问私有。
1. 返回构造器对象 Constructor
- Constructor<T> getConstructor(Class<?>... parameterTypes)、省略
- Constructor类的常用方法:newInstance(Object... initargs)
必须先创建对象才能使用下面这两个方法(因为参数需要)
2. 返回属性对象 Field
- Field getField(String name)、Field[ ] getFields()
- Field 类的常用方法:get(Object 对象)、set(Object 对象, Object value)
3. 返回方法对象 Method
- 可以返回所有的方法,包括继承的方法。Method getMethod(String name, Class<?>... parameterTypes)
- Method类的常用方法:Object invoke(Object 对象, Object... args)
4. 返回类加载器
- ClassLoader getClassLoader()
- A Java program, unlike one written in C or C++, isn't a single executable file, but instead is composed of many individual class files, each of which corresponds to a single Java class. Normally classes are only loaded on demand. This means, these Java class files are not loaded into memory all at once, but rather are loaded on demand, as needed by the program (Class Loader).
- 类加载器不仅可以加载class文件进内存,也可以加载别的文件进内存。详情见:Java - 类加载机制
- 类加载器可以用来加载文件:InputStream getResourceAsStream(String name)
5. 返回父类
- Class<? super T> getSuperclass()
6. 返回实现的接口
- Class<?>[ ] getInterfaces()
网友评论