鱼C论坛

 找回密码
 立即注册
查看: 2885|回复: 6

JDK5新特性:Annotation(注解)

[复制链接]
发表于 2011-11-1 14:26:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 菜得要自杀 于 2011-11-1 15:23 编辑

2楼:什么是注解,3种常用注释的使用(需要反射,可变参数,泛型等基础知识)
3楼:如何自定义注解
4楼:注解在JUnit中的使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-1 15:02:47 | 显示全部楼层
本帖最后由 菜得要自杀 于 2011-11-1 15:09 编辑

1.什么是Annotation(注解):
    Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误。An annotation 对代码的执行没有什么影响。

2.Annotation的作用范围:
    type(类,接口,注解,枚举), method(方法),contructor(构造方法),Local_Variable(局部变量),field(成员变量(包括枚举)),package(包),parameter(参数)。


3.需要知道的基础知识:反射基础
其实,我也挺讨厌理论的东西,所以我们开始实战吧。
问题1:如果你想重写父类方法,怎么才能确保你是重写父类的方法,而不是不小心打错个字母,变成了自己的方法。
看以下代码,当我们决定要重写父类方法的时候,只需在方法的上面一行添加一个@Override,编译器就知道,你下面的方法肯定是重写父类的方法。这个时候,如果你返回值类型或者方法名写错了,就会编译错误。

  1. package Annotation;
  2.     public class Demo {

  3.         public static void main(String[] args) {
  4.             Demo d = new Demo();
  5.             System.out.println(d);
  6.         }

  7.         @Override
  8.         public String toString() {
  9.             return "I love fishc!";
  10.         }
  11.     }
  12. }
复制代码
问题2:在JDK中,经常遇到一些不建议使用的方法(后期出现更好的方法替代了他),例如:java.lang.Thread类中的stop方法。我们如何让用户调用,编译的时候知道,这些类是不建议使用的呢?
代码2:
  1. package Annotation;

  2. public class Demo {

  3.     public static void main(String[] args) {
  4.         Demo d = new Demo();
  5.         d.deprecatedDemo();
  6.     }

  7.     @Deprecated
  8.     private void deprecatedDemo() {
  9.         System.out.println("这是不建议被使用的方法!,某某类的某某方法完全替换了他。");
  10.     }

  11. }
复制代码
在方法名前面加上@Deprecated可以标明这是一个不建议被使用的方法....

3.问题3:我在使用容器的时候,由于没使用泛型,出现了很多警告。有办法消除这些警告吗?
答案:使用SuppressWarnings可以压制很多类型警告
代码3:
  1. package Annotation;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class Demo {

  5.     public static void main(String[] args) {
  6.         Demo d = new Demo();
  7.         d.swDemo();
  8.     }

  9.     @SuppressWarnings("all")
  10.     private void swDemo() {
  11.         List a = new ArrayList();
  12.         a.add(new String("Hello Fishc"));
  13.     }

  14. }
复制代码
2


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-1 15:08:27 | 显示全部楼层

如何定义自己的Annotation

本帖最后由 菜得要自杀 于 2011-11-1 15:21 编辑

想必经过上面三个例子,大家都懂了如果用..很简单。可是如何写呢?

这里用到一个新的关键字:@interface。(好吧,我偷懒了,我拿我学习时的代码直接发上来。)

具体代码如下:

  1. package Annotation;

  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;


  6. //下面这行代码,表示这个注解可以加在成员变量上,也可以加上方法上,还可以加上类型上
  7. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
  8. //下面这行代码表示这个注解将会编译到class中,并且可以利用反射获取到。
  9. @Retention(value = RetentionPolicy.RUNTIME)
  10. public @interface MyAnnotation {
  11.     String value();
  12.     String name() default "makai";
  13.     Direction dir();
  14. }
  15. enum Direction{
  16.     EAST,
  17.     SOUTH,
  18.     WEST,
  19.     NORTH;
  20. }
复制代码

  1. package Annotation;

  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;


  4. @MyAnnotation(value = "Hello Fishc",dir = Direction.EAST)
  5. public class MyAnnotationUsage {
  6.         int a = 9;
  7.         
  8.         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  9.                 new MyAnnotationUsage().haha();
  10.                
  11.                 MyAnnotationUsage mau = new MyAnnotationUsage();
  12.                 Class<? extends MyAnnotationUsage> c = mau.getClass();
  13.                 Method m = c.getMethod("hehe", new Class[]{});
  14.                
  15.                 if (m.isAnnotationPresent(MyAnnotation.class)) {
  16.                         m.invoke(mau, new Object[]{});
  17.                         MyAnnotation ma = m.getAnnotation(MyAnnotation.class);
  18.                         System.out.println(ma.value());
  19.                 }

  20.         }
  21.         
  22.         /**
  23.          * 一般情况下,如果MyAnnotation中有属性叫value,那么这个可以直接赋值,不用写等号。
  24.          * 不过最好还是写上,因为两个以上值的时候,如果有别的属性有默认值,且省略不写,那么value必须赋值
  25.          * 给多个属性赋值,中间用","号隔开,还有,数组的大括号可以省略不写..
  26.          */
  27.         @MyAnnotation(value = "Hello Fishc", name = "菜得要自杀", dir = Direction.EAST)
  28.         private void haha() {
  29.                 System.out.println("Hi");
  30.         }

  31. }
复制代码


以上就是自定义注解。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-1 20:15:15 | 显示全部楼层
JDK5新特性,推荐传智播客张孝祥的《JAVA高新技术》视频,讲得非常的好!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-2 10:22:59 | 显示全部楼层

说实在话,我听过传智播客的教程 ,讲的实在是浅。而且讲的不是太好。。

特别是张孝详,完全感觉他在念书一样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-2 10:54:26 | 显示全部楼层
看来兄弟是高人了,要想更深入学习JAVA,不妨去看看《Java Language Specification》,
研究研究泛型的实现原理!!!对数学要求较高。或者也可以去了解下JDK7的新特性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-2 10:58:47 | 显示全部楼层
smallhero 发表于 2011-11-2 10:54
看来兄弟是高人了,要想更深入学习JAVA,不妨去看看《Java Language Specification》,
研究研究泛型的实现 ...

一般吧,泛型看过源代码了...实现比较麻烦的...

我也是学习的,嘿嘿。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表