1.java里的class文件的加载
1、类型是编译器已知的,这种.class文件在编译的时候,编译器会把.class文件打开检查(ps:不是加载)
2、从别的地方获取到了一个引用,然后动态的把这个未知类型的引用的对象的.class文件加载进jvm虚拟机里
java里的class文件的加载
RTTI(Run-Time Type Identification)运行时类型识别
反射(reflection)
RTTI(Run-Time Type Identification)运行时类型识别
如果不知道某个对象的确切类型,RTTI可以告诉你,但是有一个前提:这个类型在编译时必须已知,这样才能使用RTTI来识别它。
反射(reflection)
Class类与java.lang.reflect类库一起对反射进行了支持,该类库包含Field、Method和Constructor类,这些类的对象由JVM在启动时创建,用以表示未知类里对应的成员。这样的话就可以使用Contructor创建新的对象,用get()和set()方法获取和修改类中与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调用getFields()、getMethods()和getConstructors()等许多便利的方法,以返回表示字段、方法、以及构造器对象的数组,这样,对象信息可以在运行时被完全确定下来,而在编译时不需要知道关于类的任何事情。
2.知识剖析
反射
定义:能够分析类能力的程序被称为反射
反射库(reflection library):提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序
Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹。虚拟机利用运行时信息选择相应的方法执行。
Class类:专门用来保存上述信息的类,可以用来访问这些信息。
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)Class类没有公共构造方法。Class对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。
获取Class对象的三种方式
Object ——> getClass();
任何数据类型(包括基本数据类型)都有一个“静态”的class属性
通过Class类的静态方法:forName(String className)(常用)
Class类获取未知类里对应的成员
.getFields() .getMethods() .getConstructors()
java.lang.reflect利用反射分析类的能力
Field:描述类的域
Method:描述类的方法
Constructor:描述类的构造器
Method.invoke(Object, Object[])
调用对象所描述的方法,传递给定参数,并返回方法的返回值
反射机制的优缺点
优点:运行期类型的判断,动态类加载,动态代理使用反射。
缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
api:接口是应用程序和模块之间相互沟通的方式。提供某些功能的应用程序或者模块为了与其它程序相互沟通,对外公开了某些功能的调用方式方法,是应用程序和模块之间相互沟通的方式
3.编码实战
4.常见问题
1、private修饰?
.setAccessible(true); 作用:在用反射时访问私有变量
2、父类?
继承Object类
3. 反射的作用?
调用一些私有方法,实现黑科技。比如双卡短信发送、设置状态栏颜色、自动挂电话等
实现序列化与反序列化,比如PO的ORM,Json解析等
实现跨平台兼容,比如JDK中的SocketImpl的实现
通过xml或注解,实现依赖注入(DI),注解处理,动态代理,单元测试等功能。比如Retrofit、Spring或者Dagger
5.参考文献
Java核心技术 卷1