需求:今天作項目的時候,須要獲取某個包下面全部的類裏面的@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); } }