-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1.注解的概述
1.1 .相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。以后,javac编译器、其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。
1.2 标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
1. 3 在java.lang包中提供了最基本的注解(annotation)。
1.4 格式:@注解类名。如果只有一个value名称的属性或其他属性缺省,则可@注解名(”属性值”);
如果有多个或不缺省或者需重新赋值,则@注解名(属性名=”属性值”,…)。
2、常见最基本的注解
1、如@SuppressWarning(”deprecation”):表示压制过时警告;或者说不要警告过时提示了
SupressWarning是告知编译器或开发工具等不需要再提示指定的警告了;“deprecation”是警告的信息,即过时警告。
2、@Deprecated:表示告知调用者,该成员函数、字段等已经过时,不再推荐使用。
源代码标记@Deprecated是在JDK1.5中作为内置的annotation引入的,用于表明类(class)、方法(method)、字段(field)已经不再推荐使用,并且在以后的JDK版本中可能将其删除,编译器在默认情况下检测到有此标记的时候会提示警告信息。
3、@Override:表示下面的方法是在覆盖(父类方法),如果不存在覆盖,就会报错。
3.自定义注解
1、定义格式:@interface名称{statement}
最简单的注解类:public @interface MyAnnotation{}
1、当在源程序上加了注解,javac将java源程序编译为class文件时,会对注解的生命周期进行判断。
2、class文件中不是字节码,只有把class文件中的内容加载进内存,用类加载器加载处理后(进行完整的检查等处理),最终得到的二进制内容才是字节码。
4.为注解增加高级属性
1、可以为注解增加的高级属性的返回值类型有:
1)八种基本数据类型
2)String类型
3)Class类型
4)枚举类型
5)注解类型
6)前五种类型的数组
2、数组类型的属性:
如:int[]arrayArr() default {1,2,3};//可不定义默认值
应用:@MyAnnotation(arrayArr={2,3,4}) //可重新赋值
3、枚举类型的属性:
假设定义了一个枚举类TrafficLamp,它是EnumTest的内部类,其值是交通灯的三色。
定义:EnumTest.TrafficLamplamp();
应用:@MyAnnotation(lamp=EnumTestTrafficLamp.GREEN)
4、注解类型的属性:
假定有个注解类:MetaAnnotation,其中定义了一个属性:String value()
定义:MetaAnnotation annotation() default @MetaAnnotation(”xxx”);
5、Class类型的属性:
定义:Class cls();
应用:@MyAnnotation(cls=AnnotationDemo.class)
5.类加载器概述
1、定义:
简单说,类加载器就是加载类的工具。
在java程序中用到一个类,出现了这个类的名字。java虚拟机首先将这个类的字节码加载到内存中,通常这个类的字节码的原始信息放在硬盘上的classpath指定的目录下,把.class文件的内容加载到内存里面来,再对它进行处理,处理之后的结果就是字节码。这些工作就是类加载器在操作。
2、类加载器作用:将.class文件中的内容变为字节码加载进内存。
3、默认类加载器:
1)Java虚拟机中可安装多个类加载器,系统默认的有三个主要的,每个类负责加载特定位置的类:BootStrap、ExtClassLoader、AppClassLoader
2)类加载器本身也是Java类,因为它是Java类的加载器,本身也需要被类加载器加载,显然必须有第一个类加载器而不是java类的,这正是BootStrap。它是嵌套在Java虚拟机内核中的,已启动即出现在虚拟机中,是用c++写的一段二进制代码。所以不能通过java程序获取其名字,获得的只能是null。
4、Java虚拟机中的所有类加载器采用父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
6.自定义类加载器
1、自定义的类加载器必须继承抽象类ClassLoader,要覆写其中的findClass(String name)方法,而不用覆写loadClass()方法。
2、覆写findClass(Stringname)方法的原因:
1)在loadClass()内部是会先委托给父级,当父级找不到后返回,再调用findClass(String name)方法,也就是你自定义的类加载器去找。所以只需要覆写findClass方法,就能实现用自定义的类加载器加载类的目的。
一般自定义类加载器,会把需要加载的类放在自己指定的目录中,而java中已有的类加载器是不知道你这个目录的,所以会找不到。这样才会调用你复写的findClass()方法,用你自定义的类加载器去指定的目录加载类。
2)这是一种模板方法设计模式。这样就保留了loadClass()方法中的流程、而我们只需复写findClass方法,实现局部细节就行了。
ClassLoader提供了一个protected Class<?>defineClass(String name, byte[] b, int off, int len)方法,只需要将类对应的class文件传入,就可以将其变为字节码。
Java注解与类加载器详解
本文详细介绍了Java中的注解概念及其使用方法,包括常见注解、自定义注解以及如何为注解增加高级属性等内容。同时,还深入探讨了类加载器的工作原理及其在Java中的应用。

被折叠的 条评论
为什么被折叠?



