當前位置:首頁 » 編程語言 » 註解java反射

註解java反射

發布時間: 2022-11-18 03:32:35

java註解的類型可以是哪些

使用註解

在一般的Java開發中,最常接觸到的可能就是@Override和@SupressWarnings這兩個註解了。使用@Override的時候只需要一個簡單的聲明即可。這種稱為標記註解(marker annotation ),它的出現就代表了某種配置語義。而其它的註解是可以有自己的配置參數的。配置參數以名值對的方式出現。使用 @SupressWarnings的時候需要類似@SupressWarnings({"uncheck", "unused"})這樣的語法。在括弧裡面的是該註解可供配置的值。由於這個註解只有一個配置參數,該參數的名稱默認為value,並且可以省略。而花括弧則表示是數組類型。在JPA中的@Table註解使用類似@Table(name = "Customer", schema = "APP")這樣的語法。從這里可以看到名值對的用法。在使用註解時候的配置參數的值必須是編譯時刻的常量。

從某種角度來說,可以把註解看成是一個XML元素,該元素可以有不同的預定義的屬性。而屬性的值是可以在聲明該元素的時候自行指定的。在代碼中使用註解,就相當於把一部分元數據從XML文件移到了代碼本身之中,在一個地方管理和維護。


開發註解

在一般的開發中,只需要通過閱讀相關的API文檔來了解每個註解的配置參數的含義,並在代碼中正確使用即可。在有些情況下,可能會需要開發自己的註解。這在庫的開發中比較常見。註解的定義有點類似介面。下面的代碼給出了一個簡單的描述代碼分工安排的註解。通過該註解可以在源代碼中記錄每個類或介面的分工和進度情況。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public@interfaceAssignment{
Stringassignee();
inteffort();
doublefinished()default0;
}

@interface用來聲明一個註解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型。可以通過default來聲明參數的默認值。在這里可以看到@Retention和@Target這樣的元註解,用來聲明註解本身的行為。@Retention用來聲明註解的保留策略,有CLASS、RUNTIME和SOURCE這三種,分別表示註解保存在類文件、JVM運行時刻和源代碼中。只有當聲明為RUNTIME的時候,才能夠在運行時刻通過反射API來獲取到註解的信息。@Target用來聲明註解可以被添加在哪些類型的元素上,如類型、方法和域等。


處理註解

在程序中添加的註解,可以在編譯時刻或是運行時刻來進行處理。在編譯時刻處理的時候,是分成多趟來進行的。如果在某趟處理中產生了新的Java源文件,那麼就需要另外一趟處理來處理新生成的源文件。如此往復,直到沒有新文件被生成為止。在完成處理之後,再對Java代碼進行編譯。JDK 5中提供了apt工具用來對註解進行處理。apt是一個命令行工具,與之配套的還有一套用來描述程序語義結構的Mirror API。Mirror API(com.sun.mirror.*)描述的是程序在編譯時刻的靜態結構。通過Mirror API可以獲取到被註解的Java類型元素的信息,從而提供相應的處理邏輯。具體的處理工作交給apt工具來完成。編寫註解處理器的核心是AnnotationProcessorFactory和AnnotationProcessor兩個介面。後者表示的是註解處理器,而前者則是為某些註解類型創建註解處理器的工廠。

以上面的註解Assignment為例,當每個開發人員都在源代碼中更新進度的話,就可以通過一個註解處理器來生成一個項目整體進度的報告。 首先是註解處理器工廠的實現。

{
(Set<AnnotationTypeDeclaration>atds,?){
if(atds.isEmpty()){
returnAnnotationProcessors.NO_OP;
}
returnnewAssignmentAp(env);//返回註解處理器
}
publicCollection<String>supportedAnnotationTypes(){
returnCollections.unmodifiableList(Arrays.asList("annotation.Assignment"));
}
publicCollection<String>supportedOptions(){
returnCollections.emptySet();
}
}

AnnotationProcessorFactory介面有三個方法:getProcessorFor是根據註解的類型來返回特定的註解處理器;supportedAnnotationTypes是返回該工廠生成的註解處理器所能支持的註解類型;supportedOptions用來表示所支持的附加選項。在運行apt命令行工具的時候,可以通過-A來傳遞額外的參數給註解處理器,如-Averbose=true。當工廠通過 supportedOptions方法聲明了所能識別的附加選項之後,註解處理器就可以在運行時刻通過的getOptions方法獲取到選項的實際值。註解處理器本身的基本實現如下所示。

{
private;
;
publicAssignmentAp(){
this.env=env;
assignmentDeclaration=(AnnotationTypeDeclaration)env.getTypeDeclaration("annotation.Assignment");
}
publicvoidprocess(){
Collection<Declaration>declarations=env.getDeclarationsAnnotatedWith(assignmentDeclaration);
for(Declarationdeclaration:declarations){
processAssignmentAnnotations(declaration);
}
}
(Declarationdeclaration){
Collection<AnnotationMirror>annotations=declaration.getAnnotationMirrors();
for(AnnotationMirrormirror:annotations){
if(mirror.getAnnotationType().getDeclaration().equals(assignmentDeclaration)){
Map<,AnnotationValue>values=mirror.getElementValues();
Stringassignee=(String)getAnnotationValue(values,"assignee");//獲取註解的值
}
}
}
}

註解處理器的處理邏輯都在process方法中完成。通過一個聲明(Declaration)的getAnnotationMirrors方法就可以獲取到該聲明上所添加的註解的實際值。得到這些值之後,處理起來就不難了。

在創建好註解處理器之後,就可以通過apt命令行工具來對源代碼中的註解進行處理。 命令的運行格式是apt -classpath bin -factory annotation.apt.AssignmentApf src/annotation/work/*.java,即通過-factory來指定註解處理器工廠類的名稱。實際上,apt工具在完成處理之後,會自動調用javac來編譯處理完成後的源代碼。

JDK 5中的apt工具的不足之處在於它是Oracle提供的私有實現。在JDK 6中,通過JSR 269把自定義註解處理器這一功能進行了規范化,有了新的javax.annotation.processing這個新的API。對Mirror API也進行了更新,形成了新的javax.lang.model包。註解處理器的使用也進行了簡化,不需要再單獨運行apt這樣的命令行工具,Java編譯器本身就可以完成對註解的處理。對於同樣的功能,如果用JSR 269的做法,只需要一個類就可以了。

@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("annotation.Assignment")
{
;
publicsynchronizedvoidinit(){
super.init(processingEnv);
ElementselementUtils=processingEnv.getElementUtils();
assignmentElement=elementUtils.getTypeElement("annotation.Assignment");
}
publicbooleanprocess(Set<?extendsTypeElement>annotations,RoundEnvironmentroundEnv){
Set<?extendsElement>elements=roundEnv.getElementsAnnotatedWith(assignmentElement);
for(Elementelement:elements){
processAssignment(element);
}
}
privatevoidprocessAssignment(Elementelement){
List<?extendsAnnotationMirror>annotations=element.getAnnotationMirrors();
for(AnnotationMirrormirror:annotations){
if(mirror.getAnnotationType().asElement().equals(assignmentElement)){
Map<?extendsExecutableElement,?extendsAnnotationValue>values=mirror.getElementValues();
Stringassignee=(String)getAnnotationValue(values,"assignee");//獲取註解的值
}
}
}
}

仔細比較上面兩段代碼,可以發現它們的基本結構是類似的。不同之處在於JDK 6中通過元註解@SupportedAnnotationTypes來聲明所支持的註解類型。另外描述程序靜態結構的javax.lang.model包使用了不同的類型名稱。使用的時候也更加簡單,只需要通過javac -processor annotation.pap.AssignmentProcess Demo1.java這樣的方式即可。

上面介紹的這兩種做法都是在編譯時刻進行處理的。而有些時候則需要在運行時刻來完成對註解的處理。這個時候就需要用到Java的反射API。反射API提供了在運行時刻讀取註解信息的支持。不過前提是註解的保留策略聲明的是運行時。Java反射API的AnnotatedElement介面提供了獲取類、方法和域上的註解的實用方法。比如獲取到一個Class類對象之後,通過getAnnotation方法就可以獲取到該類上添加的指定註解類型的註解。


實例分析

下面通過一個具體的實例來分析說明在實踐中如何來使用和處理註解。假定有一個公司的雇員信息系統,從訪問控制的角度出發,對雇員的工資的更新只能由具有特定角色的用戶才能完成。考慮到訪問控制需求的普遍性,可以定義一個註解來讓開發人員方便的在代碼中聲明訪問控制許可權。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interfaceRequiredRoles{
String[]value();
}

下一步則是如何對註解進行處理,這里使用的Java的反射API並結合動態代理。下面是動態代理中的InvocationHandler介面的實現。

<T>implementsInvocationHandler{
finalTaccessObj;
publicAccessInvocationHandler(TaccessObj){
this.accessObj=accessObj;
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
RequiredRolesannotation=method.getAnnotation(RequiredRoles.class);//通過反射API獲取註解
if(annotation!=null){
String[]roles=annotation.value();
Stringrole=AccessControl.getCurrentRole();
if(!Arrays.asList(roles).contains(role)){
(".");
}
}
returnmethod.invoke(accessObj,args);
}
}

在具體使用的時候,首先要通過Proxy.newProxyInstance方法創建一個EmployeeGateway的介面的代理類,使用該代理類來完成實際的操作。

㈡ java反射機制 怎樣獲取到類上面的註解

//定義註解並指定java註解保留策略為運行時RUNTIME,運行時注入到JAVA位元組碼文件里
//這樣才可以在運行時反射並獲取它。
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@interfaceMyAnnotation{
Stringkey()default"";
intvalue()default0;
}

//使用註解
@MyAnnotation(key="key1",value=200)
classMyClass{}

//反射註解
publicstaticvoidmain(String[]args){
MyClassmyClass=newMyClass();
MyAnnotationannotation=myClass.getClass().getAnnotation(MyAnnotation.class);
System.out.println("key="+annotation.key()+" value="+annotation.value());
}

㈢ java應該要怎麼學

想要學好Java,需要有正確的學習路線,有堅持不懈的學習毅力,也需要有專業老師的指導,這樣才能學得更好。那麼,學習Java需要掌握哪些知識和技能呢?這里簡單列舉一些。

Java學習需要掌握的知識與技能:

1、Java SE部分初級語法,面向對象,異常,IO流,多線程,Java Swing,JDBC,泛型,註解,反射等。
2、資料庫部分,基礎的sql語句,sql語句調優,索引,資料庫引擎,存儲過程,觸發器,事務等。
3、前端部分, HTML5 CSS3 JS, HTML DOM Jquery BootStrap等。
4、Java EE部分,Tomcat和Nginx伺服器搭建,配置文件,Servlet,JSP,Filter,Listener,http協議,MVC等。
5、框架部分,每個框架都可以分開學,在去學如何使用SSM 或者SSH框架,如何搭建,如何整合。開發中為什麼會用框架,Rest是啥?Spring為啥經久不衰,底層如何實現等。
6、23種設計模式,掌握常用的,比如單例模式的多種實現,責任鏈模式,工廠模式,裝飾器模式等,了解常用場景。
7、基礎演算法和數據結構,八大排序演算法,查找演算法。
8、熟練使用maven等構建工具,git等版本控制工具,熟悉常用linux命令,log4j,bug,junit單元測試,日誌列印工具,Redis等NoSql。

互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。

想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。

祝你學有所成,望採納。

㈣ java反射無法動態獲取註解

@Action
public void test() throws NoSuchMethodException, SecurityException{
StackTraceElement[] stack = new Throwable().getStackTrace();
Method method = this.getClass().getMethod(stack[0].getMethodName());
for(Annotation an : method.getAnnotations()){
System.out.println(an);
}
}

也可以寫個公共方法來獲取,stack[0]這里要改成stack[1]

㈤ JAVA自定義註解:能否通過反射找到哪一個類加了該註解(在一個項目范圍內)

當然可以;
首先,你得獲得自定義類所對應的Class對象,
其次,通過Class對象獲得所對應的所有方法,建立一個Method[] list 。
然後,遍歷該Method[] list 數組,取得每一個Method對象,調用該對象的isAnnotationPresent()方法。判斷該方法是否被你所標記的Annotation修飾。
最後,如果該方法返回true,自然就是那你要找的方法,否則,false。
祝你好運!!最好就是自己找到API文檔,進行查閱相關類,以及相關方法的說明,自己編寫代碼,這樣你會學會很多的,祝你成功!!!!

㈥ java反射一定要和註解一起使用嗎

不是一定,看你要做什麼,配合註解使用可以更加靈活。比如你做個動態代理,需要用註解嗎?當然不需要。再比如說像spring的自動裝配,我們可以指定它的掃描的路徑,但是這個指定的路徑下的bean都需要自動裝配嗎?答案是否定的,那怎麼辦?這個時候就需要註解了,通過註解讓開發人員自己決定哪些需要容器管理哪些不需要,不知道你是否已經接觸過spring。但是總結下來就是反射是不一定要和註解一起使用的。

㈦ java獲取當前類上的註解內容

@Retention(RetentionPolicy.RUNTIME) // 註解會在class位元組碼文件中存在,在運行時可以通過反射獲取到
@Target({ElementType.FIELD,ElementType.METHOD})//定義註解的作用目標**作用范圍欄位、枚舉的常量/方法
@Documented//說明該註解將被包含在javadoc中
public @interface FieldMeta {

/**
* 是否為序列號
* @return
*/
boolean id() default false;
/**
* 欄位名稱
* @return
*/
String name() default "";
/**
* 是否可編輯
* @return
*/
boolean editable() default true;
/**

㈧ 想學好Java有哪些建議需要掌握哪些技能

想要學好Java,需要有正確的學習路線,有堅持不懈的學習毅力,也需要有專業老師的指導,這樣才能學得更好。那麼,學習Java需要掌握哪些知識和技能呢?這里簡單列舉一些。

Java學習需要掌握的知識與技能:

1、Java SE部分初級語法,面向對象,異常,IO流,多線程,Java Swing,JDBC,泛型,註解,反射等。
2、資料庫部分,基礎的sql語句,sql語句調優,索引,資料庫引擎,存儲過程,觸發器,事務等。
3、前端部分, HTML5 CSS3 JS, HTML DOM Jquery BootStrap等。
4、Java EE部分,Tomcat和Nginx伺服器搭建,配置文件,Servlet,JSP,Filter,Listener,http協議,MVC等。
5、框架部分,每個框架都可以分開學,在去學如何使用SSM 或者SSH框架,如何搭建,如何整合。開發中為什麼會用框架,Rest是啥?Spring為啥經久不衰,底層如何實現等。
6、23種設計模式,掌握常用的,比如單例模式的多種實現,責任鏈模式,工廠模式,裝飾器模式等,了解常用場景。
7、基礎演算法和數據結構,八大排序演算法,查找演算法。
8、熟練使用maven等構建工具,git等版本控制工具,熟悉常用linux命令,log4j,bug,junit單元測試,日誌列印工具,Redis等NoSql。

想要學習Java的小夥伴,可以選擇自學,也可以選擇找靠譜的培訓機構進行學習。你可以考察對比一下南京課工場、北大青鳥、中博軟體學院等開設有Java專業的學校。助祝你學有所成!

南京北大青鳥中博Java課堂實拍

㈨ java學習的主要內容是什麼

互聯網行業目前還是最熱門的行業之一,許多想入行互聯網的人都會選擇Java學習,發展前景非常好,普通人也可以學習。

如果想達到工作標准可以參考下面的內容:

1.Java SE部分 初級語法,面向對象,異常,IO流,多線程,Java Swing,JDBC,泛型,註解,反射等。

2.資料庫部分,基礎的sql語句,sql語句調優,索引,資料庫引擎,存儲過程,觸發器,事務等。

3. 前端部分, HTML5 CSS3 JS, HTML DOM Jquery BootStrap等。

4. Java EE部分,Tomcat和Nginx伺服器搭建,配置文件,Servlet,JSP,Filter,Listener,http協議,MVC等。

5. 框架部分,每個框架都可以分開學,在去學如何使用SSM 或者SSH框架,如何搭建,如何整合。開發中為什麼會用框架,Rest是啥?Spring為啥經久不衰,底層如何實現等。

6.23種設計模式,掌握常用的,比如單例模式的多種實現,責任鏈模式,工廠模式,裝飾器模式等,了解常用場景。

7. 基礎演算法和數據結構,八大排序演算法,查找演算法。

8. 熟練使用maven等構建工具,git等版本控制工具,熟悉常用linux命令,log4j,bug,junit單元測試,日誌列印工具,Redis等NoSql。

想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。

祝你學有所成,望採納。

㈩ java 什麼情況下是用反射的獲取方法

等你學過SSH之後你就明白為要用反射了,牛B的框架都是通過配置文件,即反射機制來做的
例如吧,你想把a對象放到b對象中,但是你並不知道B對象的方法名叫什麼
,或者並不知道用戶會將方法名定義成什麼
這個時候,你只需要在配置文件中,或者是用註解,寫上去那麼通過反射就可以得到某個方法了

反射機制是比較高級的東西,你還是踏踏實實的吧,
就這么說你可以理解不了,也並不知道他的意義在哪,
只有等你接觸的框架,代碼多了自然會明白他的作用

熱點內容
汽車的假配置有哪些 發布:2025-01-14 02:03:16 瀏覽:40
二次插值演算法 發布:2025-01-14 02:02:01 瀏覽:162
江西頁游伺服器雲主機 發布:2025-01-14 02:01:17 瀏覽:491
安卓配置描述文件在哪裡 發布:2025-01-14 01:51:21 瀏覽:259
android數據xml存儲 發布:2025-01-14 01:48:45 瀏覽:368
ueditorjava圖片上傳 發布:2025-01-14 01:48:00 瀏覽:638
伺服器硬碟如何安裝系統 發布:2025-01-14 01:38:10 瀏覽:10
2021款urv能升級哪些配置 發布:2025-01-14 01:18:53 瀏覽:203
go編程聖經 發布:2025-01-14 01:14:43 瀏覽:970
python3字元串格式 發布:2025-01-14 00:43:29 瀏覽:582