一、泛型的通配符
1.通配符使用的场景
方法的参数
2.通配符的优点
使方法更加通用
3.通配符分类
无界通配:?
子类限定:? extends Object
父类限定:? super Integer
4.通配符的缺点
使变量使用上不再方便
无界:参数和返回值为泛型的方法不能使用!
子类:参数为泛型的方法不能使用
父类:返回值为泛型的方法不能使用
二、注解
1.什么是注解
语法:@注解名称
注解的作用:替代xml配置文件
servlet3.0中,就可以不再使用web.xml文件,而是所有配置都是用注解
注解是由框架来读取使用的
2.注解的使用
定义注解类:框架的工作
使用注解:程序员的工作
读取注解(反射):框架的工作
3.定义注解类
@interface A //所有的注解都是Annotation的子类
4.使用注解
注解的作用目标:
类、方法、构造器、参数、局部变量、包
5.注解的属性
5.1定义属性
@interface MyAnno1{
int age();
String name();
}
5.2使用注解时给属性赋值
@MyAnno1(age=100,name="张三")
5.3注解属性的默认值:在定义注解时可以给注解指定默认值
@interface MyAnno2{
int age() default 100;
String name;
}
//在使用注解时,可以不给带有默认值的属性赋值
@MyAnno2(name="李四")
5.4名为value的属性的特权
当使用注解时,如果只给名为value的属性赋值时,可以省略"value=",如:
@MyAnno1(value="hello")
//可以书写成
@MyAnno1("hello")
5.5注解属性的类型
八种基本类型、String、Enum、Class、注解类型、以上类型的一维数组类型
注意:当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号
6.注解的作用目标限定以及保存策略限定
作用限定目标
让一个注解的作用目标只能在类上,不能在方法上,这就叫做用目标的限定!
@Target(value = { ElementType.METHOD,ElementType.TYPE})
@interface MyAnno1{
}
保留策略
源代码文件(Source):注解只在源代码中存在,当编译时就被忽略了
字节码文件(Class):注解在源代码中存在,然后编译时会把注解信息放到了class文件,但在JVM加载类时,会忽略注解
JVM中(RUNTIME):注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可反射注解)
//限定注解的保留策略
@Retention(Retention.RUNTIME)
@interface MyAnno1{
}
7.读取注解(反射)
Class clazz=this.getClass(); //得到子类的类型
Type type=clazz.getGenericSuperclass(); //获取传递给父类参数化类型
ParameterizedType pType=(ParameterizedType) type; //它就是A<String>
Type [] types=pType.getActualTypeArguments();//它就是一个Class数组
Class c=(Class) type[0]; //它就是Stirng
System.out.println(c.getName());
7.1要求
注解的保留策略必须是RUNTIME
7.2反射注解需要从作用目标上返回
类上的注解,需要使用Class来获取
方法上的注解,需要Mehtod来获取
构造器上的注解,需要Construcator来获取
成员上的,需要使用Field来获取
Class:
Method、Construtor、Field:AccessibleObject
它们都有一个方法:
Annotation getAnnotation(),返回目标上指定类型的注解
Annotation[] getAnnotations(),返回目标上所有注解