从jdk1.5开始,java提供了注解的功能,允许开发者定义和使用自己的注解类型,该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,
关键字@interface.使用@interface表示我们已经继承了java.lang.annotation.Annotation类,这是一个注解的基类接口。
@interface是用于自定义注解的,它里面定义的方法的声明不能有参数,也不能抛出异常,并且方法的返回值被限制为简单类型、String、Class、emnus、@interface,和这些类型的数组。
通常在使用时我们都会给这个注解类加上两个注解:
@Target(ElementType.FIELD), @Retention(RetentionPolicy.RUNTIME)
ElementType,RetentionPolicy是两个枚举类,
注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,值为:ANNOTATION_TYPE,CONSTRUCTOR ,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER和TYPE,如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。
@RetentionRetention注解表示需要在什么级别保存该注释信息,用于描述注解的生命周期,它有一个RetentionPolicy类型的value,是一个枚举类型,它有以下的几个值:
1.用@Retention(RetentionPolicy.SOURCE)修饰的注解,指定注解只保留在源文件当中,编译成类文件后就把注解去掉; 2.用@Retention(RetentionPolicy.CLASS)修饰的注解,指定注解只保留在源文件和编译后的class 文件中,当jvm加载类时就把注解去掉; 3.用@Retention(RetentionPolicy.RUNTIME )修饰的注解,指定注解可以保留在jvm中,这样就可以使用反射获取信息了。
默认是RUNTIME,这样我们才能在运行的时候通过反射获取并做对应的逻辑处理。
android中的注解式绑定控件其实本质的使用就是Java基础中反射的使用。
类Class已经泛型化了。
在以前的JDK中,Class.newInstance()方法的定义返回Object,您很可能要将该类型强制转换为另一种类型:
class Class{
Object newInstance();
}
但是使用泛型,您定义的Class.newInstance()方法具有一个更加特定的返回类型:
class Class{
T newInstance();
}
View child
Class<?> childClass = child.getClass();//获得该类型的类型类
DefaultBehavior = defaultBehavior = null;
defaultBehavior = childClass.getAnnotation(DefaultBehavior.class)) == null
result.setBehavior(defaultBehavior.value().newInstance());
result.setBehavior(defaultBehavior.value().newInstance());
@Retention(RetentionPolicy.RUNTIME)
public @interface DefaultBehavior{
Class <? extends Behavior> value();
}