ArrayList<E>
为例:ArrayList<E>
中的E称为类型参数变量ArrayList<Integer>
中的Integer称为实际类型参数ArrayList<E>
称为泛型类型ArrayList<Integer>
称为参数化的类型(ParameterizedType)// <T>:泛型定义的声明,在返回值前面。
public <T> T findOne(Class<T> clazz) {}
// 对于静态泛型方法,都必须自己定义后才能使用
public static <T> void findTwo(){}
// 定义多个泛型
public static <K,V> V find(K k);
// 类级别的泛型定义,类中的"实例方法"就可以直接使用了。
public class Demo<T> {}
// 获取带有泛型信息的父类,例如:BaseDao<User>,这个整体称为:ParameterizedType,Type是Class类的接口
Type type = XXX.class.getGenericsSuperclass();
ParameterizedType ptype = type;
Clazz clazz = ptype.getActualTypeArguments()[0];
① 注解的定义
public @interface MyAnnotation {}
② 注解的属性:既不像方法,也不像字段。
注解属性能够使用的类型:primitive(基本类型),String,Class,Annotation,enum或者是以上类型的一维数组。
如果给注解中的属性赋值,可以只指定一个值,也可以指定多个值。
public @interface MyAnnotation_1 {
// 注解的属性
String name();
// 带默认值的属性
int age() default 18;
}
③ 使用注解及属性:
public class UseAnnotation {
@MyAnnotation_1(name = "ABC", age = 18)
public void test1(){}
}
Class,Constructor,Field,Method,Packages都实现了该接口。
// 获取自己所拥有的指定的注解类型,aType是一个注解类型的字节码对象。
Annotation getAnnotataion(Class<T> aType);
// 返回所有的注解
Annotation[] getAnnotations();
// 判断自己有没有指定的注解类型
boolean isAnnotationPresent(Class<? extends Annotation> aType);
① SOURCE: .java文件
② CLASS: .class文件
③ RUNTIME:内存中的class,由类加载器把.class文件加载入内存。
① 只能用于注解的注解,就是元注解。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation_1 {}
② 放在方法上:@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation_1 {
}
原文地址:http://blog.csdn.net/biezhihua/article/details/43783165