自定義註解,jdk註解,jdk1.8新增註解。
阿新 • • 發佈:2019-01-25
1.自定義註解:
public @interfase Test{
//沒有預設值
String name();
//列舉型註解,並賦予預設值
public enum Course{
CHINESE,
MATH
};
Course course() defalut Course.MATH;
}
例如: @Test(name="張三", course=Test.Course.MATH)
public void helloWord(){}
2.使用jdk定義註解:
用 @Target 指定ElementType屬性
public enum ElementType {
// 用於類,介面,列舉,但不用於列舉值。
TYPE,
// 欄位上,包括列舉值
FIELD,
// 方法,不包括構造方法
METHOD,
// 方法的引數
PARAMETER,
// 構造方法
CONSTRUCTOR,
// 本地變數或catch語句
LOCAL_VARIABLE,
// 用於註解
ANNOTATION_TYPE,
// Java包
PACKAGE
//泛型,1.8新增
TYPE_PARAMETER,
//任意類型別,1.8新增
TYPE_USE
}
jdk1.8新增註解使用示例:
例1:註解定義:@Target(ElementType.TYPE_PARAMETER)
public @interface Annotation1 {}
註解使用:public class Test<@Annotation1 T>{}
例2:註解定義:@Target(ElementType.TYPE_USE)
public @interface Annotation2 {}
註解使用:@Annotation2
public class Test{
@Annotation2 String text;
List<@Annotation1 Object> list = new ArrayList<>();
}
3.註解保持性:
用 @Retention 指定RetentionPolicy 屬性
public enum RetentionPolicy {
// 此型別會被編譯器丟棄,不會儲存到class檔案中
SOURCE,
// 此型別註解會保留在class檔案中,但JVM會忽略它
CLASS,
// 此型別註解會保留在class檔案中,JVM會讀取它
RUNTIME
}
4.支援文件化:
@Documented
public @interface Greeting {}
注意:如果用該註解則RetentionPolicy必須設定為RUNTIME。
5.繼承:
讓該註解可以被繼承,可以作用到子類。
@Inherited
public @interface Greeting {}
6.獲取註解的方法:
public class AnnotationReadTest {
public static void main(String[] args) throws Exception {
// 獲取Test類物件
Class c = Class.forName("com.sun.Test");
// 獲取該類所有方法
Method[] methods = c.getDeclaredMethods();
// 遍歷方法
for (Method method : methods) {
// 獲取方法上面的註解
Annotation[] annotations = method.getDeclaredAnnotations();
// 遍歷註解
for (Annotation annotation : annotations) {
System.out.println("方法名為:" + method.getName() + ",方法對應的註解為:" + annotation.annotationType().getSimpleName());
//獲取該註解的所有變數
Method[] meths = annotation.annotationType().getDeclaredMethods();
// 遍歷每個註解的變數
for (Method m : meths) {
System.out.println("註解的變數名為:" + m.getName());
}
}
}
}
}
另外:
Class.getDeclaredFields()和Class.getFields()的區別:
Class.getDeclaredFields()獲取該類所有的欄位,與修飾符無關。和Class.getDeclaredMethods方法相同。
Class.getFields()獲取該類以及該類所繼承的父類所有public修飾符修飾的欄位。和Class.getMethods方法相同。
public @interfase Test{
//沒有預設值
String name();
//列舉型註解,並賦予預設值
public enum Course{
CHINESE,
MATH
};
Course course() defalut Course.MATH;
}
例如: @Test(name="張三", course=Test.Course.MATH)
public void helloWord(){}
2.使用jdk定義註解:
用 @Target 指定ElementType屬性
public enum ElementType {
// 用於類,介面,列舉,但不用於列舉值。
TYPE,
// 欄位上,包括列舉值
FIELD,
// 方法,不包括構造方法
METHOD,
// 方法的引數
PARAMETER,
// 構造方法
CONSTRUCTOR,
// 本地變數或catch語句
LOCAL_VARIABLE,
// 用於註解
ANNOTATION_TYPE,
// Java包
PACKAGE
//泛型,1.8新增
TYPE_PARAMETER,
//任意類型別,1.8新增
TYPE_USE
}
jdk1.8新增註解使用示例:
例1:註解定義:@Target(ElementType.TYPE_PARAMETER)
public @interface Annotation1 {}
註解使用:public class Test<@Annotation1 T>{}
例2:註解定義:@Target(ElementType.TYPE_USE)
public @interface Annotation2 {}
註解使用:@Annotation2
public class Test{
@Annotation2 String text;
List<@Annotation1 Object> list = new ArrayList<>();
}
3.註解保持性:
用 @Retention 指定RetentionPolicy 屬性
public enum RetentionPolicy {
// 此型別會被編譯器丟棄,不會儲存到class檔案中
SOURCE,
// 此型別註解會保留在class檔案中,但JVM會忽略它
CLASS,
// 此型別註解會保留在class檔案中,JVM會讀取它
RUNTIME
}
4.支援文件化:
@Documented
public @interface Greeting {}
注意:如果用該註解則RetentionPolicy必須設定為RUNTIME。
5.繼承:
讓該註解可以被繼承,可以作用到子類。
@Inherited
public @interface Greeting {}
6.獲取註解的方法:
public class AnnotationReadTest {
public static void main(String[] args) throws Exception {
// 獲取Test類物件
Class c = Class.forName("com.sun.Test");
// 獲取該類所有方法
Method[] methods = c.getDeclaredMethods();
// 遍歷方法
for (Method method : methods) {
// 獲取方法上面的註解
Annotation[] annotations = method.getDeclaredAnnotations();
// 遍歷註解
for (Annotation annotation : annotations) {
System.out.println("方法名為:" + method.getName() + ",方法對應的註解為:" + annotation.annotationType().getSimpleName());
//獲取該註解的所有變數
Method[] meths = annotation.annotationType().getDeclaredMethods();
// 遍歷每個註解的變數
for (Method m : meths) {
System.out.println("註解的變數名為:" + m.getName());
}
}
}
}
}
另外:
Class.getDeclaredFields()和Class.getFields()的區別:
Class.getDeclaredFields()獲取該類所有的欄位,與修飾符無關。和Class.getDeclaredMethods方法相同。
Class.getFields()獲取該類以及該類所繼承的父類所有public修飾符修飾的欄位。和Class.getMethods方法相同。