注解的使用以及注意事项
来源:互联网 发布:网络研修总结作业 编辑:程序博客网 时间:2024/05/18 00:01
注解是JDK1.5以后出现的一个新特性,注解的出现使代码变得更加灵活,更为重要的是,程序员可以通过注解控制程序运行时的行为和状态,下面通过自定义的类,方法以及字段三种注解例子说一下注解的用法以及注意事项, 注意事项在注释里,使用代码时需要导入junit4的jar包
package com.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解类型的注解要保留多久,也称时效范围,此处要通过反射去读取注解,将Retention的值选为Runtime,
//也可以选择CLASS,SOURCE,CLASS表示编译器将把注解记录在类文件中,但在运行时 VM 不需要保留注解,
//即在源码中有效,这是默认的行为,SOURCE表示编译器要丢弃的注解。
@Retention(RetentionPolicy.RUNTIME)
//指示注解类型所适用的程序元素的种类,TYPE是指类、接口(包括注解类型)或枚举声明
//METHOD表示方法声明,FIELD表示字段声明(包括枚举常量)
@Target(ElementType.TYPE)
public @interface MyAnnotationClass {
public String msgClass();
}
package com.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotationMethod {
public String msgMethod();
public String msgMethodPro();
//注解只能用public 或abstract
abstract int begin();
//注解里的字段必须初始化
public int testCount =1;
}
package com.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotationField {
public String msgField();
public String msgFieldPro();
public boolean open();
}
package com.annotation;
@MyAnnotationClass(msgClass = "类注解")
public class MyAnnotationDemo {
@MyAnnotationField(msgField = "注解1", msgFieldPro = "字段1", open = false)
public String testField;
private static MyAnnotationDemo myAnnotationDemo;
private MyAnnotationDemo() {
testField = "RED FLAG RPG";
}
public synchronized static MyAnnotationDemo getInstance() {
if (myAnnotationDemo == null) {
myAnnotationDemo = new MyAnnotationDemo();
}
return myAnnotationDemo;
}
@MyAnnotationMethod(msgMethod = "注解2", msgMethodPro = "方法2", begin = 1)
public void testRPG() {
System.out.println(testField);
}
}
package com.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class MyAnnotationDemoTest {
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
/**
* Test method for {@link MyAnnotationDemo#testRPG()}.
*/
@Test
public final void testTestRPG() {
// 获取实例
MyAnnotationDemo myAnnotationDemo = com.annotation.MyAnnotationDemo
.getInstance();
// myAnnotationDemo.testRPG();
// 使用反射获取注解信息
MyAnnotationClass myAnnotationClass = myAnnotationDemo.getClass()
.getAnnotation(MyAnnotationClass.class);
// 类注解
System.out.println("类注解msgClass:" + myAnnotationClass.msgClass());
try {
// 反射获得的字段必须是公共成员字段
Field field = myAnnotationDemo.getClass().getField("testField");
MyAnnotationField myAnnotationField = field
.getAnnotation(MyAnnotationField.class);
// 字段注解
System.out.println("字段注解msgField:" + myAnnotationField.msgField()
+ ",msgFieldPro:" + myAnnotationField.msgFieldPro()
+ ",open:" + myAnnotationField.open());
/*
* Method[] methods = myAnnotationDemo.getClass().getMethods(); for
* (Method methodTmp : methods) {
* System.out.println(methodTmp.getName()); }
*/
// 用反射获取方法,getMethod("testRPG",new Class[0])中"testRPG"表示方法名,
// new Class[0]表示方法的参数个数为0个,如果new Class[2]就表示参数个数为2个,
// 如果有多个参数个数相同但类型不同的方法,则任选一个(详见JDK1.6)
Method method = myAnnotationDemo.getClass().getMethod("testRPG",
new Class[0]);
MyAnnotationMethod myAnnotationMethod = method
.getAnnotation(MyAnnotationMethod.class);
// 方法注解
System.out.println("方法注解msgMethod:"
+ myAnnotationMethod.msgMethod() + ",msgMethodPro:"
+ myAnnotationMethod.msgMethodPro() + ",begin:"
+ myAnnotationMethod.begin() + ",testCount:"
+ myAnnotationMethod.testCount);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
* 综合上面的例子,在开发自定义注解时,需要注意以下几点:
* 1.注解的实效范围
* 2.注解适用的程序元素种类
* 3.注解里的方法和字段只能用public 或abstract
* 4.注解里的字段必须初始化
- 注解的使用以及注意事项
- SimpleDateFormat的使用以及注意事项
- PopupWindow的使用以及注意事项
- strcpy的使用以及注意事项
- Android 注解的使用与注意事项
- 【Android】注解使用注意事项
- 注解的一个注意事项
- inline 函数的使用以及注意事项
- apache 的FTPClient使用以及注意事项
- Content-Disposition的使用以及注意事项
- Java泛型的注意事项以及使用
- 黑马程序员-@property的使用以及注意事项
- AsyncTask的简单使用以及注意事项
- iOS 定时器的使用以及注意事项
- strtok()函数的使用以及注意事项
- Spring @Transactional注解使用注意事项
- java 注解annotation的使用,以及反射如何获取注解
- java 注解annotation的使用,以及反射如何获取注解
- 视口变换的矩阵求解
- 使用Spring Jdbc (4)调用存储过程
- Trim 函数
- 商业银行软件开发中心的困惑
- 彻底明白Java的多线程-线程间的通信
- 注解的使用以及注意事项
- ORA-28000: the account is locked的解决办法
- AutoIt写的DLL复制到Windows目录的小程序
- POJ 1183 反正切函数的应用
- 五种应该避免的代码注释
- JAVA定时器实现之一(通过继承TimerTask)
- SPI设备的驱动
- codeigniter 中 smtp发邮件
- Powershell工具&资源