这几天在学习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 |
允许子类继承父类中的注解 |
自定义注解又有什么用?怎么用呢?
对于注解的使用,我就使用自己编写的一个例子,有什么不好的地方大家轻拍- -#
首先,新建一个自定义注解
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"; }
然后写一个测试注解的类
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,注解就大显身手了
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注解的初步了解,可能有什么错误的地方,大家谅解- -#