1. 程式人生 > >java註解框架

java註解框架

andro override 但是 tar 會有 定義 註解處理器 mes port

姓名:鄧勇 班級:軟件151

1.元註解
2.自定義註解
3.註解處理器
android註解框架解析
我們經常會在java代碼裏面看到:[email protected],[email protected],這些是什麽?

在java裏面它們是“註解”。

下面是百度百科的解釋:java.lang.annotation.Retention可以在您定義Annotation型態時,指示編譯器如何對待您的自定義 Annotation,

預設上編譯器會將Annotation資訊留在class檔案中,但不被虛擬機器讀取,而僅用於編譯器或工具程式運行時提供資訊。

也就是說,註解是建立在class文件基礎上的東西,同C語言的宏有異曲同工的效果。

class文件裏面根本看不到註解的痕跡。

註解的基礎就是反射。所以註解可以理解為java特有的一種概念。

1.元註解

在java.lang.annotation包裏面,已經定義了4種annotation的“原語”。

1).@Target,用於明確被修飾的類型:(方法,字段,類,接口等等)  
2).@Retention,描述anntation存在的為止:

RetentionPolicy.RUNTIME 註解會在class字節碼文件中存在,在運行時可以通過反射獲取到

RetentionPolicy.CLASS 默認的保留策略,註解會在class字節碼文件中存在,但運行時無法獲得

RetentionPolicy.SOURCE 註解僅存在於源碼中,在class字節碼文件中不包含

3).@Documented,默認情況下,註解不會在javadoc中記錄,但是可以通過這個註解來表明這個註解需要被記錄。
4).@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。

[email protected]
/* */一個class,則這個annotation將被用於該class的子類。

回到頂部
2.自定義註解


package com.joyfulmath.jvmexample.annnotaion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @author deman.lu
* @version on 2016-05-23 13:36
*/

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FruitName {

String value() default "";
}
首先,一個註解一般需要2個元註解修飾:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
具體作用上面已解釋。

所有的註解都會有一個類似於“func”的部分。這個可以理解為註解的參數。


package com.joyfulmath.jvmexample.annnotaion;

import com.joyfulmath.jvmexample.TraceLog;

/**
* @author deman.lu
* @version on 2016-05-23 13:37
*/
public class Apple {

@FruitName("Apple")
String appleName;

public void displayAppleName()
{
TraceLog.i(appleName);
}
}

這段代碼的log:

05-23 13:39:38.780 26792-26792/com.joyfulmath.jvmexample I/Apple: displayAppleName: null [at (Apple.java:16)]

沒有賦值成功,為什麽?應為註解的“Apple”到底怎麽賦值該filed,目前編譯器還不知道則怎麽做呢。

回到頂部
3.註解處理器

我們還需要一個處理器來解釋 註解到底是怎樣工作的,不然就跟註釋差不多了。

通過反射的方式,可以獲取註解的內容:


package com.joyfulmath.jvmexample.annnotaion;

import com.joyfulmath.jvmexample.TraceLog;

import java.lang.reflect.Field;

/**
* @author deman.lu
* @version on 2016-05-23 14:08
*/
public class FruitInfoUtils {
public static void getFruitInfo(Class<?> clazz)
{
String fruitNameStr = "";
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields)
{
if(field.isAnnotationPresent(FruitName.class))
{
FruitName fruitName = field.getAnnotation(FruitName.class);
fruitNameStr = fruitName.value();
TraceLog.i(fruitNameStr);
}
}
}
}

java註解框架