1. 程式人生 > >java利用反射獲取某個包下的所有獲取物件屬性、方法、並例項化

java利用反射獲取某個包下的所有獲取物件屬性、方法、並例項化

首先貼上用到的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(執行物件,方法引數)