Java 注解 入门
这几天在学习 Spring3.x, 发觉现在许多框架都用上了 java 注解功能,然后自己就对 java 注解这方面初步学习了一下。
首先,注解跟注释不是一个意思,也根本不是同一个事物。
注释就是我们平常平常中对代码作解释的,也就是常见的 "//..........." 和 "/*..............*/", 相信大家也很熟悉,这里就不多说了。
对于注解,可以说是一个非常有用的技术,何为注解,其实注解就是作为一种描述,是对代码的一种描述,并且是可以读取的,可以是在程序运行时写进文件的的一种对代码的描述。(个人理解)
我们平常在一些 IDE(如 Eclipse) 编写代码过程中,可能会遇过一些代码有下波浪线或者是中间穿一条线的代码,会告诉你不提倡使用这个方法,说这个方法可能会在以后的版本中被淘汰之类的提示语,
其实这就是注解在帮助你。
因为在 java5.0(jdk1.5) 后,java 默认内置了 @Deprecated 注解,他的存在就是上述的功能,除此之外还有还有 @Override,@SuppressWarnings, 至于其他两个的作用,大家就自己去探索啦。
注解的强大之处,就是我们可以自定义自己需要的注解!
首先,注解跟类,接口一样,都是一种类型
定义一个注解的用法跟定义接口差不多,区别是多了一个 @:
@interface MyAnnotation{
String value() default "NULL";
}
这样就定义了一个属于你自己的注解了。
注解本身也是代码,当然也有注解可以描述注解。
这个读起来有点怪异,但是这个是一个重要的特征,注解的注解就是描述注解的作用范围,生存范围的。
对注解的描述有四种, 包括:
@Target({ElementType.METHOD})// 描述注解的作用范围,ElementType.METHOD 是参数,表示只能作用于方法, 例如
@MyAnnotation() // 这是错误的
public class AnnotataionTest{
@MyAnnotataion() // 这是正确的
public void test(){
}
}
其余三种,作用如下:
@Retention |
表示需要在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在 class 文件中可用,但会被 VM 丢弃 RUNTIME:VM 将在运行期间保留注解,因此可以通过反射机制读取注解的信息。 |
@Document |
将注解包含在 Javadoc 中 |
@Inherited |
允许子类继承父类中的注解 |
自定义注解又有什么用?怎么用呢?
对于注解的使用,我就使用自己编写的一个例子,有什么不好的地方大家轻拍 - -#
首先,新建一个自定义注解
1 2 3 4 5 6 7 8 9 10 11 | package my.annotation.i; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target ({ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default "NULL" ; } |
然后写一个测试注解的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package my.annotation.impl; import my.annotation.i.MyAnnotation; public class AnnotationTest { @MyAnnotation ( "This is method 1" ) public String method1(String s){ System.out.println( "method1 is invoked,params is " +s); return s; } public String method2(String s){ System.out.println( "method2 is invoked,params is " +s); return s; } @MyAnnotation ( "This is method 3" ) public String method3(String s){ System.out.println( "method3 is invoked,params is " +s); return s; } } |
最后写一个 Client,注解就大显身手了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package my.annotation.client; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import my.annotation.i.MyAnnotation; import my.annotation.impl.AnnotationTest; public class Client { public static void main(String[] args) throws Exception{ Class cs = Class.forName( "my.annotation.impl.AnnotationTest" ); Method[] methods = cs.getDeclaredMethods(); for (Method method:methods){ if (method.isAnnotationPresent(MyAnnotation. class )){ MyAnnotation aTest = method.getAnnotation(MyAnnotation. class ); method.invoke(cs.newInstance(),aTest.value()); } } } } |
输出如下:
method1 is invoked,params is This is method 1
method3 is invoked,params is This is method 3
这是我对 java 注解的初步了解,可能有什么错误的地方,大家谅解 - -#