java利用反射獲取某個包下的所有獲取物件屬性、方法、並例項化
阿新 • • 發佈:2018-12-18
首先貼上用到的jar包,當然也可以通過遞迴file.list獲取類的路徑名稱。
maven匯入jar包:
<dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.11</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency>
一、用reflections的方式
public static List<String> clazzLis=new ArrayList<String>(); Reflections reflections=new Reflections("testsunmet.imp.*"); //比如可以獲取有Pay註解的class Set<Class<?>> classes=reflections.getTypesAnnotatedWith(Pay.class); for(Class<?> cl:classes){ Pay pay=cl.getAnnotation(Pay.class); clazzList.add(cl.getCanonicalName())//使用list把獲取到的class路徑裝起來 } }
二、使用遞迴file.list的方式
List<String> clzList=new ArrayList<>(); private void scanPackages(String packageName){ //獲取指定包的完整路徑 String packagesUrl=this.getClass().getClassLoader().getResource("/"+packageName.replaceAll("\\.", "/")).getFile(); File scanFile=new File(packagesUrl); String[] filenameList=scanFile.list(); for(String filename:filenameList){ File file=new File(scanFile,filename); if(file.isDirectory()){ scanPackages(packageName+"."+filename); }else{ if(filename.indexOf(".class")>0) clzList.add(packageName+"."+filename.replace(".class","")); } } }
個人推薦使用reflections。
1.使用
//使用class.forName獲取物件 如Class clazz=Class.forName("xxxx.class");
//clazz.newInstance()使用建立物件
//使用clazz.isAnnotationPresent(xxx.class)判斷是否式某種註解上的物件
//獲取註解上的值 clazz.getAnnotation(xxx.class)
//設定屬性值
Field[] declaredFields=clazz2.newInstance().getClass().getDeclaredFields();
for(Field field:declaredFields){
field.setAccessible(true);//使可以set私有屬性的值
//這只是測試,如果真正使用,注意set的值對應上
field.set(clazz2.newInstance(), "test");
}
//獲取方法
Method[] methods=clazz.newInstance().getClass().getMethods();
//執行物件中的方法
methods.invoke(執行物件,方法引數)