Class类和Class实例
张三、李四两个对象
class Person{
//张三、李四共同的具备的行为(方法)和状态(字段)
}
Person就是张三、李四这两个对象的类型,即是张三李四两个对象的描述
一切皆对象,那么person、Date、String...又是什么类型呢?--Class,即都是Class类的对象,都由Class类来描述
Class的实例是什么?--就应该是类或接口【更严格的说是java中的字节码(类或接口编译后生成的.class文件)】
Class类:用于描述一切类或接口
Class实例:就是JVM中的一份字节码(一个类或接口) (枚举是一种类、注解是一种接口)
问题:那Class实例到底表示的是哪一份字节码(或者哪一个类或接口)?
Class clz1=Date.class;
Class clz2=String.class;
为了明确区分出Class实例表示的是谁的字节码,Class类提供了泛型!!
上面两个示例中,是省略了泛型的写法------第一个示例的clz1表示的是Date的字节码,Date.class的类型就是Class<Date>;第二个示例的clz2表示的是String的字节码,String.class的类型就是:Class<String>
(上面的写法会出现编译警告)
在实例化时无法确定所表示的字节码类型时通常使用通配符?或者T,上面的两个示例可以写为下面的方式:
Class<Date> clz1=Date.class;//不会出现编译警告
Class<String> clz2=String.class;
或者使用通配符:
Class<?> clz1=Date.class;//不会出现编译警告
Class<?> clz2=String.class;
public void demo(Class<?> clazz);
泛型通配符?(或者T):表示的是当前所表示的字节码类型-----?是在实例化时无法确定所表示的字节码类型时使用的,通配所有类型
Class类中没有字段、显示构造器
如何得到Class的实例?------有三种方式
1、数据类型.class-------就是一个字节码
2、静态方法forName(String className);----Class.forName(String className);-----根据一个类的全限定名来构建Class对象,该方法会抛出ClassNotFoundException异常---注意必须是全限定名才能获得对应实例
3、对象.getClass();----------每个对象都有该方法,因此该方法定义在Object类中----返回的是该对象的真实类型,即运行时类型
Object obj=new Date();
Obj的编译是类型Object
obj.toLocalString();//toLocalString是Date类的方法,代码在编译阶段去编译类型Object中检查是否有该方法,如没有,编译失败;–这条语句会在编译阶段报错
反射可以解决:
Class clz=obj.getClass();//等价于Class<Date> clz=obj.getClass(); 通常写法:Class<?> clz=obj.getClass();--------此时的?表示的时obj的运行时类型,即Date类型
clz.toLocalString();//正确
一个类或接口在Java虚拟机(JVM)中,有且只有一份字节码