真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

你真的會用Java自定義注解嗎?

注解:
注解為我們在代碼中添加信息提供一種形式化的方法,使我們可以在源碼、編譯時、運(yùn)行時非常方便的使用這些數(shù)據(jù)。

創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶千余家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長!

注解是在JAVA SE5中引入的,注解讓代碼更干凈易讀并且可以實現(xiàn)編譯期類型檢查等。當(dāng)創(chuàng)建描述性質(zhì)的類或接口時,如果有重復(fù)性的工作,就可以考慮使用注解來簡化或自動化該過程。我們可以讓注解保存在源代碼中,并且利用Annotation API處理注解,得到我們想要的數(shù)據(jù)并加以處理,注解的使用比較簡單,JAVA SE5內(nèi)置了3種:

  • @Override 表示當(dāng)前類中的方法將覆蓋父類中的方法,如果不寫也不會有錯,但是@Override可以起到檢查作用,如方法名拼寫錯誤,編譯器就會報警告信息。
  • @Deprecated 表示被標(biāo)注的方法已經(jīng)被廢棄了,如果使用編譯器會發(fā)出警告信息。
  • @SuppressWarnings 關(guān)閉不當(dāng)?shù)木幾g器警告信息。除非你確定編譯器的警告信息是錯誤的,否則最好不要使用這個注解。
定義注解

先來看內(nèi)置注解@Override是怎么被定義的,它位于package java.lang之下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Target、@Retention稱為元注解:元注解負(fù)責(zé)注解其他的注釋,如:@Target定義聲明的注解的作用域(作用在類上還是方法上)
br/>@Target定義聲明的注解的作用域(作用在類上還是方法上)
除了@Target、@Retention還有@Documented及@Inherited,下面用一個表格來分別列出他們各自的作用:

你真的會用Java自定義注解嗎?

@Retention作用范圍如下圖所示:

你真的會用Java自定義注解嗎?

注解處理器

首先來自定義一個注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationInfo {

String[] value();

int requestCode() default 0;
}
  • 注解中定義的方法沒有參數(shù),且返回類型僅限于原始類型,字符串,枚舉,注解或以上類型的集合
  • 注解中定義的方法可以有默認(rèn)值
運(yùn)行時解析注解

@Target(ElementType.METHOD)指明了我們的注解是作用在方法上的
@Retention(RetentionPolicy.RUNTIME)表示注解在程序運(yùn)行時期也會存在,即注解信息也會加載到虛擬機(jī)VM中,所以可以通過反射來獲取注解的相關(guān)信息:

public class AnnotationExample {

/**
* 注解模擬請求權(quán)限
*/
@AnnotationInfo(value = {"android.permission.CALL_PHONE", "android.permission.CAMERA"}, requestCode = 10)
public void requestPermission() {
//其他邏輯
}
}

接著來編寫一個運(yùn)行時解析注解的Java類:AnnotationRuntimeProcessor.java

public class AnnotationRuntimeProcessor {

public static void main(String[] args) {
try {
//獲取AnnotationExample的Class對象
Class cls = Class.forName("com.javastudy.Annotation.AnnotationExample");
//獲取AnnotationExample類中的方法
Method[] methods = cls.getDeclaredMethods();
for (Method method : methods) {
//過濾不含自定義注解AnnotationInfo的方法
boolean isHasAnnotation = method.isAnnotationPresent(AnnotationInfo.class);
if (isHasAnnotation) {
method.setAccessible(true);
//獲取方法上的注解
AnnotationInfo aInfo = method.getAnnotation(AnnotationInfo.class);
if (aInfo == null) return;
//解析注解上對應(yīng)的信息
String[] permissions = aInfo.value();
System.out.println("value: " + Arrays.toString(permissions));

int requestCode = aInfo.requestCode();
System.out.println("requestCode: " + requestCode);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

上面的邏輯很簡單,反射拿到有注解對應(yīng)類的Class對象,篩選含有注解的方法,最后獲取方法上的注解并解析,運(yùn)行結(jié)果如下:

value: [android.permission.CALL_PHONE, android.permission.CAMERA]
requestCode: 10
編譯時解析注解

AbstractProcessor是javax下的API,java和javax都是Java的API(Application Programming Interface)包,java是核心包,javax的x是extension的意思,也就是擴(kuò)展包。一般繼承AbstractProcessor需要實現(xiàn)下面的幾個方法:

public class ProcessorExample extends AbstractProcessor {

@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
//processingEnvironment提供各種工具類 如Elements Filer Types SourceVersion等
super.init(processingEnvironment);
}

/**
* 掃描 評估和處理注解代碼 生成Java代碼
*
* @param set 注解類型
* @param roundEnvironment 有關(guān)當(dāng)前和以前的信息環(huán)境 查詢出包含特定注解的被注解元素
* @return 返回true 表示注解已聲明 后續(xù)Processor不會再處理 false表示后續(xù)Processor會處理他們
*/
@Override
public boolean process(Set set, RoundEnvironment roundEnvironment) {
return false;
}

@Override
public SourceVersion getSupportedSourceVersion() {
return super.getSupportedSourceVersion();
}

@Override
public Set getSupportedAnnotationTypes() {
return super.getSupportedAnnotationTypes();
}
}
  • init(ProcessingEnvironment env): 每一個注解處理器類都必須有一個空的構(gòu)造函數(shù)。然而,這里有一個特殊的init()方法,它會被注解處理工具調(diào)用,并輸入ProcessingEnviroment參數(shù)。ProcessingEnviroment提供很多有用的工具類Elements, Types和Filer。后面我們將看到詳細(xì)的內(nèi)容。
  • process(Set (? extends TypeElement) annotations, RoundEnvironment env): 這相當(dāng)于每個處理器的主函數(shù)main()。你在這里寫你的掃描、評估和處理注解的代碼,以及生成Java文件。輸入?yún)?shù)RoundEnviroment,可以讓你查詢出包含特定注解的被注解元素。后面我們將看到詳細(xì)的內(nèi)容。
  • getSupportedAnnotationTypes(): 這里你必須指定,這個注解處理器是注冊給哪個注解的。注意,它的返回值是一個字符串的集合,包含本處理器想要處理的注解類型的合法全稱。換句話說,你在這里定義你的注解處理器注冊到哪些注解上。
  • getSupportedSourceVersion(): 用來指定你使用的Java版本。通常這里返回SourceVersion.latestSupported()。然而,如果你有足夠的理由只支持Java 6的話,你也可以返回SourceVersion.RELEASE_6。推薦使用前者。

網(wǎng)站名稱:你真的會用Java自定義注解嗎?
文章鏈接:http://weahome.cn/article/jjchjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部