Class类:描述Java中的一切类事务。
Class实例代表内存中的一份字节码,所谓字节码就是当Java虚拟机加载某个类的对象时,首先需要把硬盘上该类的二进制源码编译成class文件的二进制代码(字节码),然后把class文件的字节码加载到内存中,之后再创建该类的对象。
如何获取Class类的对象,即相应类的字节码呢?
1、调用相应类对象的getClass()方法
Data data;
Class dataclass=data.getClass() ;
2、通过Class类中的静态方法forName(),来获取与字符串对应的Class对象
Class dataclass=Class.forName("Data");
3、通过类名.class形式来实现
Class dataclass=Data.class
第一种方式为对象的方法,而后两种方式为类的方法。
基本应用
所谓反射就是把Java类中的各种成分映射成相应的Java类。
通过反射,在具体编写程序时,不仅可以动态地生成某个类中所需要的成员,而且还能动态调用相应的成员。
反射涉及的类:Class(表示一个类的类)、Field(表示属性的类)、Method(表示方法的类)、Constrctor(表示类的构造方法的类)。
Class类位于java.lang包中,后面3个类位于java.lang.reflect包中。
高级应用
标注
@Override
java.lang.Override被用作标注方法,主要用于子类在覆盖父类中的方法名时,检测方法名称。
位置可以放在方法的上边,还可以放在方法的前边。
@Deprecated
例子:1方法和2方法能实现相同的功能,但2方法效果更好,若是去掉1方法,则调用该方法的类就会出现错误。为了兼容以前的类而又不建议新设计的类使用1方法,则把1方法作@Deprecated。
@Deprecated修饰具有一定的延续性:即在代码中通过继承或者覆盖的方式使用这个过时的类型及成员,虽然继承或覆盖后的类型及成员并不是被声明为@Deprecated的,但编译器仍然要报警。
位置可以在方法的前边,还能用在参数或类的前边。
@SuppressWarnings
java.lang.SuppressWarnings被用作标注类、属性、方法等成员,主要用于屏蔽警告。
可以带参数,可以是多个。
当@SuppressWarnings接收的参数为多个值时,必须以数组的方式为参数赋值。
例如:@SuppressWarnings({"deprecation","unused","unchecked"}).
类加载器
加载类的工具,字节码的制造器。
运行一个.class文件-->运行java.exe-->根据%JAVA_HOME%\jre\lib\i386\jvm.cfg配置来选择激活JVM-->启动及初始化工作完成后产生BootstrapLoader加载器。
BootstrapLoader加载器不需要加载,由C++编写。
内置类加载器ExtClassLoader和AppClassLoader定义在sun.misc.Launcher.class中为内部类,由BootstrapLoader加载器即在进入JVM。
类加载器装载某个类字节码的过程实际上就是创建Class类的一个对象实例。
JVM中有多个类加载器,JVM加载一个具体的类时,通过什么方式选择类加载器?这些加载器之间有什么关系呢?
1、第一个类加载器(BootstrapLoader):引导类加载器,其他类加载器也需要加载。引导类加载器由操作系统的本地代码实现,不需要加载,主要负责加载Java核心包中的类(%JAVA_HOME%\jre\lib目录下的jar文件)。
2、ExtClassLoader(扩展类类加载器)和AppClassLoader(应用程序类加载器)
扩展类类加载器主要负责扩展路径下的代码,即位于%JAVA_HOME%\jre\lib\ext目录下的jar文件或通过java.ext.dirs这个系统属性指定路径下的代码。
应用程序类加载器:负责加载应用程序,即CLASSPATH这个系统属性指定路径下的代码。
委派模型:如果应用程序类加载器需要加载一个类,它首先委托扩展类加载器,扩展类加载器再委托引导类加载器。如果父类加载器不能加载类,子类加载器就会在自己的库中查找这个类。如果这时还加载不了,就会抛出ClassNotFoundException。基于这个特性,类加载器只负责它的祖先无法加载的类。