---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
注解 :
@Override 注解表示子类要重写父类的对应方法。
@Deprecated 注解表示方法是不建议被使用的。
@SuppressWarnings({“unchecked”,” ”}) 表示压制警告。里面是一个数组。
自义注解:当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性值即可,除了value以外的其他值都需要使用name = value这种赋值方式,即明确指定给谁赋值。
当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口,如果我们定义一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口不是注解,Annotation本身是接口而不是注解。可以与Enum类比。
默认值在CLASS阶段。
Override 是source阶段,压制检查也是在source阶段,过时在runtime阶段。
下面是自定义注解:
@Mo
public class AnnotationTeset {
@Mo
public static void main(String[] args) throws Exception{
//此处是用反射得到注解
if(AnnotationTeset.class.isAnnotationPresent(Mo.class))
{
Mo m = AnnotationTeset.class.getAnnotation(Mo.class);
System.out.println(m);
}
}
}
下面是注解类:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Mo {
}
Target 里面 是注解要修饰的范围如类、方法等,其中类要用TYPE因为类有许多种如接口,等,所以JAVA的CLASS实现了一个叫Type的接口。
下面是复杂类型的注解:
@Mo(name = "Myong")
public class AnnotationTeset {
@Mo(name = "Myong123")
public static void main(String[] args) throws Exception{
//此处是用反射得到注解
if(AnnotationTeset.class.isAnnotationPresent(Mo.class))
{
Mo m = AnnotationTeset.class.getAnnotation(Mo.class);
System.out.println(m);
System.out.println(m.aaa().length);
System.out.println(m.name());
System.out.println(m.cc());
}
}
}
下面是注解 Mo文件 :
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Mo {
String name();
int[] aaa() default {1,2,3};
M cc() default @M("Myongyun");
}
下面是注解M:
@Retention(RetentionPolicy.RUNTIME)
public @interface M {
String value();
}