Java反射
反射为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多.
Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作,返回 Class 对象
只有类能直接调用,对象不能
Class.forName() 的形式会装入类并做类的静态初始化,返回 Class 对象。
返回一个给定类或者接口的一个 Class 对象,如果没有给定 classloader, 那么会使用根类加载器。如果 initalize 这个参数传了 true,那么给定的类如果之前没有被初始化过,那么会被初始化。而我们给定的 MySQL 的 Driver 类中,它在静态代码块中通过 JDBC 的 DriverManager 注册了一下驱动。我们也可以直接使用 JDBC 的驱动管理器注册 mysql 驱动,从而代替使用 Class.forName。
getClass() 的形式会对类进行静态初始化、非静态初始化,返回引用运行时真正所指的对象(因为子对象的引用可能会赋给父对象的引用变量中)所属的类的 Class 对象。
是一种类的实例方法。在获得类型类之后,你就可以调用其中的一些方法获得类型的信息了
静态属性初始化是在加载类的时候初始化,而非静态属性初始化是 new 类实例对象的时候初始化。它们三种情况在生成 Class 对象的时候都会先判断内存中是否已经加载此类。
instanceof
instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。类的实例包含本身的实例,以及所有直接或间接子类的实例。instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树(同级之间是无法比较的),否则会编译错误。左边的对象实例不能是基础数据类型
强制类型转换:
由于父类没有某个属性所以需要转为子类
不满足继承关系的类型间无法强转,所以参考强制类型转换的要求提供了instanceof关键字来判断两种类型是否在同一科继承树上,并返回布尔类型值。
(Object基类中的equals(Object obj)方法无法根据实例的某些属性,比如姓名,ID等主键元素判断对象是否相同,只能判断两个实例的堆区地址是否相同)
注意子类转换为父类,可能丢失自己的本来的一些方法!