回顾:
1. 泛型:---限制类中成员的数据类型。
2. 定义泛型类的格式:
public class 类名<泛型标志,标志....>{
private 标志 属性;
}
3. 创建泛型对象时: 需要指定泛型类型,如果没有指定,则认为Object类型。
4. 泛型通配符---泛型上限extends和泛型下限super。
5. 泛型接口---
6. 泛型方法。<标志>
7. 注解:
[1]预定义注解。@Override @FunctionInterface[检测接口中有且仅有一个抽象方法]
[2]自定义注解 @interface 注解名{} @注解名
[3]元注解
目录:
1. 元注解
2. 自定义注解的高级
技术细节:
1. 元注解
使用在注解上的注解就是元注解。
@Target: 作用: 告诉该注解使用的范围,如果不加任何参数默认可以用在所有地方
*Target有哪些参数
TYPE,可以使用在类上 FIELD,使用在属性上 METHOD,使用方法上 PARAMETER, 使用在方法参数上 CONSTRUCTOR, 使用在构造方法上
@Retention: 作用: 该注解什么时候有效。默认: SOURCE
SOURCE: 源码时有效 CLASS: 字节码时 RUNTIME: 运行时有效。【采用的最多】
@Documented: 作用: 在代码生成api文档时是否存在该注解,
代码演示:
自定义注解:
package demo01;
public class Test01 {
}
//自定义注解
//语法 @interface + 注解名 my
//上方不加任何元注解,可以用在任何地方;如下:
@interface my{
}
@my //可以用在方法上
class hello{
@my //可以用在属性上
private String name;
@my //可以用在属性上
public void show(){
}
public void print( @my String name){//可以用在方法参数上
}
}
@Target作用
package demo01;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
public class Test02 {
}
/**
* @Target 表示该元注解可以使用的范围
* TYPE 类上
*
*/
//元注解
@Target(ElementType.TYPE)
@interface me{//自定义注解
}
@me
class show{
private String name;
public void show(){
}
public void print( String name){
}
}
生成api文档:
(避免中文乱码加上UTF-8)
2. 自定义注解的高级
自定义注解的时候可以在定义的注解里面加上属性值。
@interface 注解名{
数据类型 属性名();
}
数据类型可以是哪些类型?
基本数据类型, 字符串类型,枚举类型,注解类型,以及上面这些类型的数组类型。
package demo01;
//枚举类
public enum MyEnum {
BEIJING,NANJING,RIBEN;
}
-------------------
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
int age(); //基本类型
String name();//字符串类型
MyEnum address();//枚举
My my();//注解类型
int[] ages();
String[] names();
//MyEnum[] addresss();
//My[] mys();
}
-------------------
//如果属性为数组类型,给数组类型赋值时如果只有一个值那么可以省略{}
//如果该注解中只使用value属性,那么value属性名可以省略。
@MyAnnotation(age=15,name="张三",address = MyEnum.BEIJING,my=@My,ages={15,25,35},names="hello")
@My(value = "good",name="张学友")
public class Student {
public void show(){
System.out.println("hello");
}
}
*如果属性定义好后,在使用该注解是需要指定属性的值,(除非有默认值)