java--注解和类加载器--学习笔记
- 注解--Annotation
- 定义
- 自定义注解
- 注解的属性
- JDK内置的注解
- 元注解
- 类加载器
- JDK中的类加载器
- JAVA的双亲委派机制
注解–Annotation
定义
注解Annotation是一种引用数据类型,编译之后也是xxx.class文件。
语法格式: @注解类型名
自定义注解
【修饰符列表】 @interface 注解类型名{ } -----可自定义注解
//自定义注解1
public @interface MyAnno {
// String name() ; //注解中的 属性必须赋值,或者指定默认值,
String name() default ""; //默认值为空。
String color() ;
int age() default 25;
}
//自定义注解2
public @interface Anno2 {
String value() ;
}
注解可以出现在类上,属性上,方法上,变量上等…还可以出现在注解类型上。
//注解样例代码2
// 注解可以放置的位置:若无元注解特殊要求 可以出现在类上,属性上,方法上,变量上等...
public class AnnotationTest {
@Override
@MyAnno(color = "")
public String toString() {
return "tostring";
}
@Anno2("heh")
public static void main(String[] args) {
int i;
@MyAnno(color = "")
int k;
}
}
注解的属性
注解当作如果有属性,必须给属性赋值。
注解当中的属性类型可以是:byte,short,int,long,float, double, boolean, char, String, Class, 枚举类型,以及以上的每一种数组形式。
//注解样例代码1
// 注解的若只有value属性 则注解时可省略 value=
public class Annotation02 {
public static void main(String[] args) {
Annotation02 a=new Annotation02();
a.doSome();
a.doOther();
}
@Deprecated
@MyAnno(color = "ss") //注解color未指定默认值,不可以省略color =
public static void doSome(){
System.out.println("do something!");
}
@Deprecated
@Anno2("不多说,指定好吧") //注解如果是value属性 且只有一个value属性则可以省略 则 ”value= “ 可以省略,否则不能
public static void doOther(){
System.out.println("do Other...");
}
}
JDK内置的注解
java.lang包下有: Deprecated,Override
Deprecated 用@Deprecated注释的程序元素,不鼓励程序员使用这样的元素,可用在某方法或者某类上,表示该方法或者该类 已过时。 (这个注解只是提醒作用)
Override 表示一个方法声明打算重写超类中的方法声明。Override 只能注解方法,这个注解是给编译器参考的,和运行阶段没有关系,但是如果这个方法不是重写父类,则编译器报错。
元注解
元注解:用来标注“注解类型”的“注解”,成为元注解。(注解上面的注解为元注解)
常用的元注解:Target,Retention
Target 用来标注 “注解” 指定注解可以出现的位置。
Retention 指定注解的保存位置。
@Rentention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
@Rentention(RetentionPolicy.CLASS):表示该注解会保留在Class文件中。
@Rentention(RetentionPolicy.RUNTIME):表示该注解被保存至class文件所读取。
使注解可以被反射:+元注解 @Taget({ElementType.FIELD})
反射机制判断存不存在注解:
Class sc=Class.forName("java.lang.String");
sc.isAnnotationPresent(MyAnnotation.class));
反射机制判断访问注解属性:
MyAnnotation m=(MyAnnotation)sc.getAnnotation(MyAnnotation.class);
m.属性 即可调属性接口。
类加载器
JDK中的类加载器: 专门负责加载类的命令/工具。 (ClassLoader)
JDK中的类加载器
JDK中自带了三个类加载器:启动类加载器、扩展类加载器、应用类加载器。
启动类加载器 专门加载: C:\Program Files\Java\jdk1.8.0_101\jre\lid\rt.jar
扩展类加载器 加载: C:\Program Files\Java\jdk1.8.0_101\jre\lid\ext.jar
应用类加载器 专门加载: classpath 中的jar 包 (即自己定义的类)
JAVA的双亲委派机制
一段代码在开始执行前,会将所需要的类全部加载到JVM中。
首先通过 启动类加载器 加载。
如果启动类加载器找不到某个类,那么通过扩展类加载器加载。
如果扩展类加载器没有加载到,会通过应用类加载器加载。 这便是 java中的双亲委派机制。
(这样做保证了首先从java自带的类中加载,保证了程序的安全性。)
最后,附上npy沙雕的日常。