java注解spring注解 详解.docx
《java注解spring注解 详解.docx》由会员分享,可在线阅读,更多相关《java注解spring注解 详解.docx(61页珍藏版)》请在冰点文库上搜索。
java注解spring注解详解
基本内置注解
@Overridejava中覆写
@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的
@deprecated标记有相同的功能,准确的说,它还不如javadoc
@deprecated,因为它不支持参数
@SuppressWarnings,其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当Switch程序块直接通往下一种情况而没有Break时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID定义时的警告
finally,任何finally子句不能正常完成时的警告
all,关于以上所有情况的警告
自定义注释
它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如:
public@interfaceNewAnnotation{}............
java中的注解机制
2010-04-2212:
42
注解(Annotation)为我们在代码中天界信息提供了一种形式化的方法,是我们可以在稍后
某个时刻方便地使用这些数据(通过解析注解来使用这些数据)。
注解的语法比较简单,除了@符号的使用以外,它基本上与java的固有语法一致,java内置了三种
注解,定义在java.lang包中。
@Override表示当前方法是覆盖父类的方法。
@Deprecated表示当前元素是不赞成使用的。
@SuppressWarnings表示关闭一些不当的编译器警告信息。
下面是一个定义注解的实例
Java代码
packageTest_annotation;
importjava.lang.annotation.Documented;
importjava.lang.annotation.Inherited;
importjava.lang.annotation.Retention;
importjava.lang.annotation.Target;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.RetentionPolicy;
/*
*元注解@Target,@Retention,@Documented,@Inherited
*
* @Target表示该注解用于什么地方,可能的ElemenetType参数包括:
* ElemenetType.CONSTRUCTOR构造器声明
* ElemenetType.FIELD域声明(包括enum实例)
* ElemenetType.LOCAL_VARIABLE局部变量声明
* ElemenetType.METHOD方法声明
* ElemenetType.PACKAGE包声明
* ElemenetType.PARAMETER参数声明
* ElemenetType.TYPE类,接口(包括注解类型)或enum声明
*
* @Retention表示在什么级别保存该注解信息。
可选的RetentionPolicy参数包括:
* RetentionPolicy.SOURCE注解将被编译器丢弃
* RetentionPolicy.CLASS注解在class文件中可用,但会被VM丢弃
* RetentionPolicy.RUNTIMEVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
*
* @Documented将此注解包含在javadoc中
*
* @Inherited允许子类继承父类中的注解
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
/*
*定义注解Test
*注解中含有两个元素id和description
*description元素有默认值"nodescription"
*/
public@interfaceTest{
publicintid();
publicStringdescription()default"nodescription";
}
packageTest_annotation;
importjava.lang.annotation.Documented;
importjava.lang.annotation.Inherited;
importjava.lang.annotation.Retention;
importjava.lang.annotation.Target;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.RetentionPolicy;
/*
*元注解@Target,@Retention,@Documented,@Inherited
*
* @Target表示该注解用于什么地方,可能的ElemenetType参数包括:
* ElemenetType.CONSTRUCTOR构造器声明
* ElemenetType.FIELD域声明(包括enum实例)
* ElemenetType.LOCAL_VARIABLE局部变量声明
* ElemenetType.METHOD方法声明
* ElemenetType.PACKAGE包声明
* ElemenetType.PARAMETER参数声明
* ElemenetType.TYPE类,接口(包括注解类型)或enum声明
*
* @Retention表示在什么级别保存该注解信息。
可选的RetentionPolicy参数包括:
* RetentionPolicy.SOURCE注解将被编译器丢弃
* RetentionPolicy.CLASS注解在class文件中可用,但会被VM丢弃
* RetentionPolicy.RUNTIMEVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
*
* @Documented将此注解包含在javadoc中
*
* @Inherited允许子类继承父类中的注解
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
/*
*定义注解Test
*注解中含有两个元素id和description
*description元素有默认值"nodescription"
*/
public@interfaceTest{
publicintid();
publicStringdescription()default"nodescription";
}
下面是一个使用注解和解析注解的实例
Java代码
packageTest_annotation;
importjava.lang.reflect.Method;
publicclassTest_1{
/*
*被注解的三个方法
*/
@Test(id=1,description="hellomethod_1")
publicvoidmethod_1(){
}
@Test(id=2)
publicvoidmethod_2(){
}
@Test(id=3,description="lastmethod")
publicvoidmethod_3(){
}
/*
*解析注解,将Test_1类所有被注解方法的信息打印出来
*/
publicstaticvoidmain(String[]args){
Method[]methods=Test_1.class.getDeclaredMethods();
for(Methodmethod:
methods){
/*
*判断方法中是否有指定注解类型的注解
*/
booleanhasAnnotation=method.isAnnotationPresent(Test.class);
if(hasAnnotation){
/*
*根据注解类型返回方法的指定类型注解
*/
Testannotation=method.getAnnotation(Test.class);
System.out.println("Test(method="+method.getName()
+",id="+annotation.id()+",description="
+annotation.description()+")");
}
}
}
}
packageTest_annotation;
importjava.lang.reflect.Method;
publicclassTest_1{
/*
*被注解的三个方法
*/
@Test(id=1,description="hellomethod_1")
publicvoidmethod_1(){
}
@Test(id=2)
publicvoidmethod_2(){
}
@Test(id=3,description="lastmethod")
publicvoidmethod_3(){
}
/*
*解析注解,将Test_1类所有被注解方法的信息打印出来
*/
publicstaticvoidmain(String[]args){
Method[]methods=Test_1.class.getDeclaredMethods();
for(Methodmethod:
methods){
/*
*判断方法中是否有指定注解类型的注解
*/
booleanhasAnnotation=method.isAnnotationPresent(Test.class);
if(hasAnnotation){
/*
*根据注解类型返回方法的指定类型注解
*/
Testannotation=method.getAnnotation(Test.class);
System.out.println("Test(method="+method.getName()
+",id="+annotation.id()+",description="
+annotation.description()+")");
}
}
}
}
输出结果如下:
Test(method=method_1,id=1,description=hellomethod_1)
Test(method=method_2,id=2,description=nodescription)
Test(method=method_3,id=3,description=lastmethod)
Java之注解
文章分类:
Java编程
注解:
也指元数据,在代码中添加信息提供的一种形式化方法。
JavaSE5内置了三种标准注解:
@Override,@Deprecated,@SuppressWarnings.
四种元注解:
@Target,@Retention,@Documented,@Inherited.
@Target表示可用于什么地方,ElementType包含有:
类、接口(包括注释类型)或枚举声明:
ElementType.TYPE
字段声明(包括枚举常量)ElementTypeFIELD
方法声明ElementType.METHOD
参数声明ElementType.PARAMETER
构造方法声明ElementType.CONSTRUCTOR
局部变量声明ElementType.LOCAL_VARIABLE
注释类型声明ElementType.ANNOTATION_TYPE
包声明ElementType.PACKAGE
@Retention表示注释的生命周期,RetentionPolicy取值有:
SOURCE编译器要丢弃的注释
CLASS 编译器将把注释记录在类文件中,但在运行时VM不需要保留注释
RUNTIME编译器将把注释记录在类文件中,在运行时VM将保留注释,可以反射性地读取
一定义注解
Useraction注解类
Java代码
1.import java.lang.annotation.ElementType;
2.import java.lang.annotation.Retention;
3.import java.lang.annotation.RetentionPolicy;
4.import java.lang.annotation.Target;
5.
6.@Retention(RetentionPolicy.RUNTIME)
7.@Target({ElementType.METHOD,ElementType.TYPE})
8.
9.public @interface Useraction {
10.
11. String userName() default "david";
12. Hobbys getHobbs() default Hobbys.程序;
13. String [] getUserAddress() default {"成都高升"};
14. String sex();
15. //如注释类只有一个属性:
userName,那么就要指明属性:
16. //LovePer lovePer() default @LovePer(userName="Emma");
17. //注释类默认属性为:
value,可不加属性值,直接输入值就行了
18. LovePer lovePer() default @LovePer("Emma");
19. @SuppressWarnings("rawtypes")
20. Class commanyName();
21.}
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public@interfaceUseraction{
StringuserName()default"david";
HobbysgetHobbs()defaultHobbys.程序;
String[]getUserAddress()default{"成都高升"};
Stringsex();
//如注释类只有一个属性:
userName,那么就要指明属性:
//LovePerlovePer()default@LovePer(userName="Emma");
//注释类默认属性为:
value,可不加属性值,直接输入值就行了
LovePerlovePer()default@LovePer("Emma");
@SuppressWarnings("rawtypes")
ClasscommanyName();
}
相关类:
Java代码
1.public enum Hobbys {
2. 音乐,
3. 电影,
4. 小说,
5. 程序,
6. 游泳
7.}
8.
9.public @interface LovePer {
10. //String userName();
11. String value();
12.}
13.
14.public class Commanys {
15.
16. public Commanys() {
17.
18. }
19.
20. private String name = "志向信息技术开发公司";
21.
22. public String getName() {
23. return name;
24. }
25.
26. public void setName(String name) {
27. this.name = name;
28. }
29.
30.}
31.
32.public class CommanysTwo {
33. private String name = "志大信息技术开发公司";
34. public String getName() {
35. return name;
36. }
37. public void setName(String name) {
38. this.name = name;
39. }
40. public CommanysTwo() {
41.
42. }
43.}
publicenumHobbys{
音乐,
电影,
小说,
程序,
游泳
}
public@interfaceLovePer{
//StringuserName();
Stringvalue();
}
publicclassCommanys{
publicCommanys(){
}
privateStringname="志向信息技术开发公司";
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
publicclassCommanysTwo{
privateStringname="志大信息技术开发公司";
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicCommanysTwo(){
}
}
UseractionTest注解类的测试
Java代码
1.import java.lang.reflect.InvocationTargetException;
2.import java.lang.reflect.Method;
3.
4.@Useraction(commanyName=Commanys.class,userName="陈国强",getHobbs=Hobbys.电影,getUserAddress="重庆大平",sex="男",lovePer=@LovePer("李中"))
5.public class UseractionTest {
6.
7. @SuppressWarnings("rawtypes")
8. public static void main(String[] args) throws Exception{