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

本文详细介绍了Java注解的使用方式及其元注解的功能,并通过示例展示了如何自定义注解。此外,还深入探讨了Java类加载器的工作原理,包括类加载的过程、委托机制及自定义类加载器的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         -----------  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.youkuaiyun.com/heima



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值