A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏晓彤 中级黑马   /  2013-3-1 16:24  /  1537 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏晓彤 于 2013-3-1 18:47 编辑

这是张老师基础加强35里的视频截图,为什么同时在类和方法上加了通一个注解,但打印出注解属性的值是类注解上赋值的值,这里avlue的值是abc

F4CBA3V~B4_P%O$%)TE00YG.jpg (45.7 KB, 下载次数: 8)

F4CBA3V~B4_P%O$%)TE00YG.jpg

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 付玉光 于 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");
}

回复 使用道具 举报
你应该是没有看仔细吧,在这个代码中分别得到了类的注解和主函数的注解,分别是这么实现的
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);//这个得到的是类的注解,所以打印的值就是”abc“
Method mainMethod = AnnotationTest.class.getMethod("main", String[].class);
                ItcastAnnotation annotation2 = (ItcastAnnotation)mainMethod.getAnnotation(ItcastAnnotation.class);
//这个得到的就是主函数的注解,打印value的值就是”xyz“;根据Method和Class类中相同的getAnnotation的方法得到格子的注解。
再看一遍源码,你就明白了。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
唐长智 发表于 2013-3-1 18:11
你应该是没有看仔细吧,在这个代码中分别得到了类的注解和主函数的注解,分别是这么实现的
ItcastAnnotatio ...

豁然开朗...有时候就这样,谢谢
回复 使用道具 举报
付玉光 发表于 2013-3-1 18:07
楼主现在还在吗?能不能把问题描述的再清晰一点呀?

为什么同时在类和方法上加了  (通)  一个注解   ,我理解力差!被3楼抢先了。
回复 使用道具 举报
付玉光 发表于 2013-3-1 18:42
为什么同时在类和方法上加了  (通)  一个注解   ,我理解力差!被3楼抢先了。 ...

不甘心到非常,,,,
回复 使用道具 举报
付玉光 发表于 2013-3-1 18:42
为什么同时在类和方法上加了  (通)  一个注解   ,我理解力差!被3楼抢先了。 ...

手误,嘿嘿。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马