本帖最后由 付玉光 于 2013-3-1 18:45 编辑
楼主现在还在吗?能不能把问题描述的再清晰一点呀?
[url=]//@Override[/url] //覆写父类中的方法时,要用该注解。
// boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
// 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
//<A extends Annotation> A getAnnotation(Class<A> annotationClass)
// 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
enum TrafficLamp{
//每个元素都是这个类的子类的一个实例对象,因这个类
//中有抽象的方法,说明得通过本类的子类创建对象,
//三个元素每个元素都是由它的子类来
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
public static void main(String args[]){}
}
//这是一个注解类型。
@interface MetaAnnotation{
String value();
}
//它上可加多个注解。
//为注解添加属性,在用的时候就要指定属性。
//如果数组属性只有一个值,大括号也可不加的。
@ItcastAnnotation(color = "red",value="abc",arrayAttr={1,2,3},annotationAttr=@MetaAnnotation("flx"))
class AnnotationDemo1{
//它里面的值也是属性,它属性的名字非常的特殊,可省力不写。
@SuppressWarnings("deprecation")//一个注解就是一个实例对象。
//此处没有指定color,等效于它是默认值。
@ItcastAnnotation("xyz")
public static void main(String args[])throws Exception{
//如果不想让他有警告信息,应在方法上加注解。
System.runFinalizersOnExit(true);
//虽main方法写在该类中,并不表:我这个代码属于这
//个类,但main方法必须要放在一个类中。
//判断指定的注解是否在一个类中
//如果类上存在指定的注解,则返回注解对象,
//此时没用了泛型,所以需强制转换。
//这个实例对象是通过反射得到的,一但在某个
//地方加了@就表示有了一个注解的实例对象。
if(AnnotationDemo1.class.isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationDemo1.class.getAnnotation(ItcastAnnotation.class);
//没有打印任何内容。
System.out.println(annotation.color());
//要打印它数组里的内容,因其是int[]数组,无法打印出具体内容。
//int[] 不会当成Object[]来看待。
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
//得到注解的属性,由于该属性还是注解,可在调用属性value方法。
System.out.println(annotation.annotationAttr().value());
};
System.out.println("==========================================");
//得到主函数上的注解,
if(AnnotationDemo1.class.getMethod("main",String[].class).isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotation annotation1 = (ItcastAnnotation)AnnotationDemo1.class.getMethod("main",String[].class).getAnnotation(ItcastAnnotation.class);
//没有打印任何内容。
System.out.println(annotation1.color());
//要打印它数组里的内容,因其是int[]数组,无法打印出具体内容。
//int[] 不会当成Object[]来看待。
System.out.println(annotation1.arrayAttr().length);
System.out.println(annotation1.lamp().nextLamp().name());
//得到注解的属性,由于该属性还是注解,可在调用属性value方法。
System.out.println(annotation1.annotationAttr().value());
};
}
@Deprecated //
public static void sayHello(){
System.out.println("hi ,传智播客");
}
}
//该意思是说:把我自定义的注解保留到运行时,
@Retention(RetentionPolicy.RUNTIME)//在我定义的注解上加注解(元注解:在注解类中加的注解)
@Target({ElementType.METHOD,ElementType.TYPE})//它接收一个数组值,
@interface ItcastAnnotation{//我定义的注解,注解很像接口,
//它的属性很像方法,这个属性是abstract 和public 的,你不加,它自动加。
//可以为它指定缺省属性,
String color() default "blue";
//如果只有一个value属性需要赋值,那么就可以不写value等号了,
String value();
//数组类型的属性,它里的类型是整数。
int[] arrayAttr() default {3,4,4};
//有一个枚举类型的属性
TrafficLamp lamp() default TrafficLamp.RED;
//有一个注解类型的。
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");
}
|