1. 程式人生 > >實用的java註解工具類

實用的java註解工具類

註解,相信大家都會知道,像@requestMapping,@Resource,@Controller等等的一些註解,大家都用過,那麼,他的工具類你用過嗎?下面就和大家一起來分享一下註解工具類。
首 Java 註解
定義:註解(Annotation),也叫元資料。一種程式碼級別的說明。
它是JDK1.5及以後版本引入的一個特性,與類、介面、列舉是在同一個層次。
它可以宣告在包、類、欄位、方法、區域性變數、方法引數等的前面,用來對這些元素進行說明,註釋。
這裡寫圖片描述
從上圖可以看出,java註解可以分為:標準註解,元註解

元註解:        

  元註解的作用就是負責註解其他註解。Java5.0定義了4個標準的meta-annotation型別,它們被用來提供對其它 annotation型別作說明。Java5.0定義的元註解:       
    
[email protected]
,     [email protected],     [email protected],     [email protected]   這些型別和它們所支援的類在java.lang.annotation包中可以找到。下面我們看一下每個元註解的作用和相應分引數的使用說明。 @Target:    @Target說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、 成員變數、列舉值)、方法引數和本地變數(如循 環變數、catch引數)。在Annotation型別的宣告中使用了target可更加明晰其修飾的目標。 作用:用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)   取值(ElementType)有:
[email protected]
(ElementType.TYPE) —— 可以適用於任何類的元素 [email protected](ElementType.FIELD) —— 只適用於欄位或屬性 [email protected](ElementType.METHOD) —— 只適用於方法的註解 [email protected](ElementType.PARAMETER) —— 只適用於方法的引數 [email protected](ElementType.CONSTRUCTOR) —— 只適用於建構函式
[email protected]
(ElementType.LOCAL_VARIABLE) —— 只適用於區域性變數 [email protected](ElementType.ANNOTATION_TYPE) —— 指明宣告型別本身是一個註解型別 [email protected](ElementType.PACKAGE) —— 只適用於包的註解

例項如下:

package target; 

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


@Target(ElementType.TYPE)   
public @interface Table {   

    /**
     * 
         * @description 資料庫表名稱註解,預設值為類名稱
         * @author  liushaocheng       
         * @created 2016年6月6日 下午8:11:51     
         * @return
     */
    public String tableName() default "className";
}   

註解Table 可以用於註解類、介面(包括註解型別) 或enum宣告,而註解NoDBColumn僅可用於註解類的成員變數。   

@Retention: 

  @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在源 程式碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中; 
編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class 被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。   
使用這個meta-Annotation可以對 Annotation的“生命週期”限制。 
作用:表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)   
  取值(RetentionPoicy)有:  

    1.SOURCE:在原始檔中有效(即原始檔保留)    
    2.CLASS:在class檔案中有效(即class保留)   
    3.RUNTIME:在執行時有效(即執行時保留)    

Retention meta-annotation型別有唯一的value作為成員,它的取值來自java.lang.annotation.RetentionPolicy的列舉型別值。具體例項如下:   
package retention;  

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

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

    public String name() default "filedName";

    public String setFunName() default "setField";
}   
Column註解的的RetentionPolicy的屬性值是RUTIME,這樣註解處理器可以通過反射,獲取到該註解的屬性值,從而去做一些執行時的邏輯處理    

@Documented:    

  @Documented用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒  
有成員。    
例項如下:   
package documented; 

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


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

    public String name() default "fieldName";
}   

@Inherited:

  @Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個
annotation將被用於該class的子類。
  注意:@Inherited annotation型別是被標註過的class的子類所繼承。類並不從它所實現的介面繼承annotation,方法並不從它所過載的方法繼承annotation。
  當@Inherited annotation型別標註的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼 承性。如果我們使用java.lang.reflect去查詢一個
Inherited annotation型別的annotation時,反射程式碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation型別被發現, 或者到達類繼承結構的頂層。

例項如下:

package inherited;  

import java.lang.annotation.Inherited;  

@Inherited  
public @interface Greeting {    

    public enum FontColor{BLUE, RED, GREEN};

    String name();

    FontColor fontColor() default 
}   

好了,介紹完json的分類,接下來就是json的工具類的寫法,以下就是json的工具類程式碼,希望可以幫到大家!

package com.bwie.util;


import java.io.File;  
import java.io.FileFilter;  
import java.io.IOException;  
import java.lang.reflect.Method;
import java.net.URL;  
import java.net.URLDecoder;  
import java.util.ArrayList;  
import java.util.Enumeration;  
import java.util.List;  

import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
     * Title: GetAnnotationValueUtil.java    
     * Description: 獲取註解的值     
 */
public class GetAnnotationValueUtil {  

    /**
     * 
         * @description 獲取註解的值
         * @author  liushaocheng       
         * @return
     */
    public static List<String> getRequestMappingValue(String packageName) {

        GetAnnotationValueUtil getAnnotationValueUtil = new GetAnnotationValueUtil();

         //第一個class類的集合  
        List<Class<?>> classes = new ArrayList<Class<?>>();  

        //是否迴圈迭代  
        boolean recursive = true;  

        //獲取包的名字 並進行替換  
        String packageDirName = packageName.replace('.', '/');  

        //定義一個列舉的集合 並進行迴圈來處理這個目錄下的檔案 
        Enumeration<URL> dirs;  
        try {  
            //讀取指定package下的所有class
            dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName); 

            while (dirs.hasMoreElements()){  
                URL url = dirs.nextElement();  

                //得到協議的名稱  
                String protocol = url.getProtocol();

                //判斷是否以檔案的形式儲存在伺服器上  
                if ("file".equals(protocol)) {  
                    //獲取包的物理路徑  
                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");  

                    //以檔案的方式掃描整個包下的檔案 並新增到集合中  
                    getAnnotationValueUtil.findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
                } 
            }  
        } catch (IOException e) { 
            e.printStackTrace();  
        } 

        List<String> stringList = new ArrayList<String>();

        for (Class<?> clazz : classes) {
            //迴圈獲取所有的類
            Class<?> c = clazz;

            //獲取類的所有方法
            Method[] methods = c.getMethods();

            for (Method method : methods) {
                //獲取RequestMapping註解
                RequestMapping annotation = method.getAnnotation(RequestMapping.class);

                if (annotation != null) {
                    //獲取註解的value值
                    String[] value = annotation.value();
                    for (String string : value) {
                        //放入List集合
                        stringList.add(string);
                    }
                }
            }
        }
        return stringList;
    }

   /**
    * 
        * @description 獲取包下的所有類    
        * @param packageName
        * @param packagePath
        * @param recursive
        * @param classes
    */
    public void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes){  

        //獲取此包的目錄 建立一個File  
        File dir = new File(packagePath);  

        //如果不存在或者 也不是目錄就直接返回  
        if (!dir.exists() || !dir.isDirectory()) {  
            return;  
        }  
        //如果存在 就獲取包下的所有檔案 包括目錄  
        File[] dirfiles = dir.listFiles(new FileFilter() {  
              //自定義過濾規則 如果可以迴圈(包含子目錄) 或則是以.class結尾的檔案(編譯好的java類檔案)  
              public boolean accept(File file) { 

                return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));  
              }  
        }); 
        //迴圈所有檔案  
        for (File file : dirfiles) { 
            //如果是目錄 則繼續掃描  
            if (file.isDirectory()) {
                findAndAddClassesInPackageByFile(packageName + "." + file.getName(),  
                                      file.getAbsolutePath(),  
                                      recursive,  
                                      classes);  
            }  
            else {  
                //如果是java類檔案 去掉後面的.class 只留下類名  
                String className = file.getName().substring(0, file.getName().length() - 6); 
                try {  
                    //新增到集合中去  
                    classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));  
                } catch (ClassNotFoundException e) {  
                    e.printStackTrace();  
                }  
            }  
        } 
    }

    private GetAnnotationValueUtil() {

    }    
}

使用說明:
傳入一個類似於“com.bwie.controoler”的包名,就會搜尋這個包下的所有類的RequestMapping註解裡的值,然後放到集合中輸出

相關推薦

實用java註解工具

註解,相信大家都會知道,像@requestMapping,@Resource,@Controller等等的一些註解,大家都用過,那麼,他的工具類你用過嗎?下面就和大家一起來分享一下註解工具類。 首 Java 註解 定義:註解

一個實用java字串工具(擷取,去尾,轉碼)

package com.xx.sisp.iface.common.util; import org.apache.commons.lang3.StringUtils; import java.io.UnsupportedEncodingException;

Java日期工具

multipl efault 簡體中文 類型 分鐘 sub dateutil 表示 exception public class DateUtil { //默認顯示日期的格式 public static final String DATAFORMAT_ST

java Collections 工具

ofb read int 交換 個數 frequency sta alt 工具 1.reverse反轉2.shuffle隨機排序3.sort自然排序4.sort指定比較器排序5.swap將下標位置為x和y的元素進行交換6.max 最大值7.min 最小值8.frequenc

開源Java時間工具Joda-Time體驗

java import org.joda.time.*; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Test; import java

Java工具:判斷對象是否為空或null

sar 判斷 ins == span urn lean color style 1 import java.lang.reflect.Array; 2 import java.util.Collection; 3 import java.util.Map; 4

JAVA StringUtils工具

eat mov 去除 apache source xtra tab sub one org.apache.commons.lang Class StringUtils java.lang.Object org.apache.commons.lang.St

java FileUtil工具

copyfile 部分 ace malformed put 字符 windows final 沒有 網上的版本太多,整合了一下適合自己用的工具類,包括讀取、保存、拷貝文件等。 public class FileUtil { /** * 私有構造方法,防止

強大的Java Json工具

bsp input ext line bject style shm 工具類 tac 轉自: https://blog.csdn.net/u014676619/article/details/49624165 import java.io.Buffered

Java 常用工具整理

一、org.apache.commons.io.IOUtils closeQuietly 關閉一個IO流、socket、或者selector且不丟擲異常。通常放在finally塊。 toString 轉換IO流、 Uri、 byte[]為String。

java ExcelUtil工具List轉Excel,Excel轉List

首先要做一個 通過欄位名稱獲取屬性值 的方法 /** * @MethodName : getFieldValueByName * @Description : 根據欄位名獲取欄位值 * @param fieldName 欄位名 * @param o 物件 * @return 欄位值

Java 常用工具

PageBaen 分頁工具類 package com.strurts.utli; import java.util.Map; import javax.servlet.http.HttpServletRequest; public class PageBean {

java常用工具(一)—— Map 與 Bean 之間的互相轉換

import net.bytebuddy.implementation.bytecode.Throw; import org.springframework.cglib.beans.BeanMap; import java.beans.PropertyDescriptor; import java.lang

JavaEE程式設計實驗 實驗1 Java常用工具程式設計(未完成)

1.使用String類分割split將字串“Solutions to selected exercises can be found in the electronic document The Thinking in Java Annotated Solution Guide,available for a

SimpleDateFormatUtils-java日期工具

寫了個日期工具類 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 格式化日期的工具類 * @author * */ public

java常用工具(二)—— JSON處理工具

tor ast val simple sta 轉換 local pass password package com.springboot.commons.utils; import com.springboot.commons.scan.JacksonObjectMapp

Java併發工具詳解

在JDK的併發包裡提供了幾個非常有用的併發工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種併發流程控制的手段,Exchanger工具類則提供了線上程間交換資料的一種手段。本章會配合一些應用場景來介紹如何使用這些工具類。 等待多執行緒完成的Cou

java工具->時間

public class DateUtil { /** * 獲得拼接的時間 * @auther zy * @param time * @return */ public static Long getLongTimes(Str

JAVA常用工具(二) ArrayUtils

該工具類主要運算元組。 以下陣列的型別使用T代替,同一函式中T代表相同型別。T可包含的型別有:Object、boolean、int、byte、char、double、float、long、short。 陣列判斷函式: 1.判斷是否存在,返回boolean: ArrayUtils.co

JAVA常用工具(一) StringUtils

該工具類是用於操作Java.lang.String類的。 StringUtils類與String類的區別在於:此類是null安全的,即如果輸入引數String為null,則不會丟擲NullPointerException異常,程式碼更健壯。 以函式isEmpty為例子: 存在字串stri