黑马程序员_高薪技术(注解和类加载器)_8

来源:互联网 发布:手机淘宝怎么激活 编辑:程序博客网 时间:2024/06/07 18:21
         ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


注解:

JDK1.5的新特性,注解当于一种标记,在程序中加了注解就等于为程序打上了某种标记Java中有3中内置注解,他们都是在java.lang包里面。@Override 表示当前方法是覆盖父类的方法。@Deprecated 表示当前元素是过时的,不赞同使用。 @SuppressWarning 表示关闭一些编译器警告信息。这个注解是要传递参数的。当然也可以自定义注解,自定义的注解中往往要添加元注解。常用的元注解有@Retention:表示注解类型的注解要保留多久,它有3个值RetentionPolicy.SOURCE、etentionPolicy.CLASS、etentionPolicy.RUNTIME。分别表示Annotation类型的信息只会保留在源代码中、CLASS文件中、字节码中。@Target: 表示注释类型所使用的程序元素的种类。不声明则可以用在任一程序元素中。其中ElementType程序元素类型提供了Java程序中声明的元素的简单分类:1、Annotation.TYPE: 注释类型;2、CONSTRUCTION: 构造方法;3、FIELD: 字段(包括枚举常量);4、OCAL_VARIABLE: 局部变量;5、METHOD:方法;6、PACKAGE: 包;7、PARAMETER: 8、参数TYPE: 类Class、接口Interface(包括注释类型Annotation)或枚举Enum

在自定义的注解类型中要用到3个类,他们的关系如下:

定义注解的方法:

public @interface ItcastAnnotation {String color() default "blue";       //注解中有值,而且定义了默认的值String value();   //假如只有一个元素。}用@ItcastAnnotation("red") 这种方式来给注解赋值。下面是一个自定义注解的演示。package cn.itcast.day3;import java.util.HashSet;import java.util.Set;@ItcastAnnotation("red")             //运用注解public class AnnotationDemo {@SuppressWarnings("rawtypes")public static void main(String[] args) {//Set set = new HashSet();if (AnnotationDemo.class.isAnnotationPresent(ItcastAnnotation.class))       //运用了ItcastAnnotation这个注解就会返回true。 {ItcastAnnotation itcastAnnotation = AnnotationDemo.class.getAnnotation(ItcastAnnotation.class);System.out.println(itcastAnnotation);}}}


类加载器。

java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。不过本文只讨论其加载类的功能。为了完成加载类的这个职责,ClassLoader提供了一系列的方法,比较重要的方法如 表 1所示。关于这些方法的细节会在下面进行介绍。

Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader。类加载器也是JAVA类。其中Bootstrap不是个类,所以它不用类加载器加载。Java虚拟机中的所有类加载器都才用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要指出其指定一个父级类加载器对象或者默认采用系统类装载器为其父级类加载。

 

类加载器的委托机制:类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。

 

类加载的过程:在前面介绍类加载器的代理模式的时候,提到过类加载器会首先代理给其它类加载器来尝试加载某个类。这就意味着真正完成类的加载工作的类加载器和启动这个加载过程的类加载器,有可能不是同一个。真正完成类的加载工作是通过调用 defineClass来实现的;而启动类的加载过程是通过调用 loadClass来实现的。前者称为一个类的定义加载器(defining loader),后者称为初始加载器(initiating loader)。在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的其它类的初始加载器类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。也就是说,对于一个类加载器实例来说,相同全名的类只加载一次,即 loadClass方法不会被重复调用。

 

自定义类加载器:一般来说,自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法 loadClass()封装了前面提到的代理模式的实现。该方法会首先调用 findLoadedClass()方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆盖loadClass()方法。而是重写findClass()方法。方法里面找到后调用defineClass方法


----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima



原创粉丝点击