小程序:掃描包中全部的類並獲取每一個類中特定的註解的值

需求:今天作項目的時候,須要獲取某個包下面全部的類裏面的@Resources字段的名字以及所注入的接口所對應的路徑java

要是這文件夾只有幾個Action的話,我卻是能夠考慮直接手動,但是 有整整70多個Action,若是我手動輸入的話豈不是要花不少不少時間,並且也不保證效率,因而乎就索性寫了個小程序來獲得這些數據小程序

具體步驟代碼以下:code

 一:獲取指定包下全部的類server

public static void scan(String packageName ,List<Class<?>> list) throws Exception{ 
//packageName爲指定的目錄如com.xxx.xxx
    String path="E:\\dev\\eachserver\\eachpre\\src\\main\\java\\com\\each\\http\\business\\action";
    File dir=new File(path);
    File[] files=dir.listFiles(); //獲取此目錄下的文件列表
    Class<?> cla=null;
    for(File f:files){
            cla=Class.forName(packageName+"."+f.getName().split("\\.")[0]);
            list.add(cla);\\class添加進list
    }
}

二:掃瞄類裏面特定的註解所對應的類對象

public static void getAnnotion(List<Class<?>> list) throws Exception{
    System.out.println(list.size());  //打印文件數量
    Map<String,String> map = new HashMap<String,String>();
    for(Class<?> cla:list){
        Field[] field = Class.forName(cla.getName()).getDeclaredFields();\\獲取class裏面所聲明的字段

        for (Field field1:field){
            if (field1.getAnnotation(Resource.class)!=null){ \\判斷此字段是否有@Resource
                map.put(field1.getAnnotation(Resource.class).name(),field1.getType().getName());
           \\以防重複 這個地方是用map儲存
            }
        }

    }
    for ( Map.Entry<String,String> entry:map.entrySet()){
//        System.out.println("<dubbo:reference group=\""+entry.getKey()+"\" id=\""+entry.getKey()+"\" interface=\""+entry.getValue()+"\" version=\"1.0\"/>");
        System.out.println(entry.getKey()+" "+entry.getValue()); \\遍歷打印
    }
}

源代碼:接口

package com.each;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by zhu on 2016/4/28.
 */
public class TestMain {

public static void scan(String packageName ,List<Class<?>> list) throws Exception{
    String path="E:\\dev\\eachserver\\eachpre\\src\\main\\java\\com\\each\\http\\business\\action";
    File dir=new File(path);
    File[] files=dir.listFiles();
    Class<?> cla=null;
    for(File f:files){//E:\dev\eachserver\eachpre\src\main\java\com\each\http\business\action
        if(f.isDirectory()){
            String childName=packageName+"."+f.getName();
            scan(childName, list);

        }else{
            cla=Class.forName(packageName+"."+f.getName().split("\\.")[0]);
            list.add(cla);
        }
    }
}
public static void getAnnotion(List<Class<?>> list) throws Exception{
    System.out.println(list.size());
    Map<String,String> map = new HashMap<String,String>();
    for(Class<?> cla:list){
        Field[] field = Class.forName(cla.getName()).getDeclaredFields();

        for (Field field1:field){
            if (field1.getAnnotation(Resource.class)!=null){
                map.put(field1.getAnnotation(Resource.class).name(),field1.getType().getName());
            }
        }

    }
    for ( Map.Entry<String,String> entry:map.entrySet()){
//        System.out.println("<dubbo:reference group=\""+entry.getKey()+"\" id=\""+entry.getKey()+"\" interface=\""+entry.getValue()+"\" version=\"1.0\"/>");
        System.out.println(entry.getKey()+" "+entry.getValue());
    }
}


    public static void main(String[] args) throws Exception {
        List<Class<?>> list=new ArrayList<Class<?>>();
        scan("com.each.http.business.action",list);//把這個對象的路徑寫入,就能夠了。
        getAnnotion(list);

        }
    }
相關文章
相關標籤/搜索