一、在java中识别运行时对象和类的信息的两种方式:
1.RTTI,它假定我们自编译时已经知道了所有的类型;
2.反射机制,它允许我们在运行时发现和使用类的信息。
二、Class对象
1.Class对象就是用来创建类的所有的“常规”对象的。
2.为了生成Class对象,虚拟机将使用被称为“类加载器”的子系统。
3.生成Class对象的引用的两种方式:
#Class.forName();
#使用类字面常量:XX.class(基本数据类型的包装器类还可以使用XX.TYPE,编程思想建议都使用XX.class,以保持一致性)
二者区别:使用.class来创建对Class对象的引用时,不会自动地初始化该Class对象,初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。
4.为了在使用泛化的Class引用时放松限制,可以使用通配符。
通配符就是"?",表示任何事物。
再此之上加点限制就是,Class表示T的父类,Class表示T的子类。
三、RTTI形式
#传统的类型转换(Shape),可能会抛出异常。
#Class对象
#关键字instanceof
如下,进行向下转型前,如果不知道这个对象什么类型,使用instanceof很重要,否则可能会得到一个ClassCastException异常。
Class.isInstance()方法使我们不在需要instanceof表达式
isAssignableFrom:判定此Class对象所表示的类或接口与指定的Class参数所表示的类或接口是否相同,或是否是其超类或超接口。如果是则返回true,否则返回false。如果该Class表示一个基本类型,且指定的Class参数正是该Class对象,则该方法返回true,否则返回false。
四、关于反射
Class的getMethod()和getConstructors()方法分别返回Method对象的数组和Constructor对象的数组。
五、动态代理
Java的动态代理实际上就是在一般的代理模式上实现了InvocationHandler接口