java利用反射获取某个包下的所有获取对象属性、方法、并实例化

首先贴上用到的jar包,当然也可以通过递归file.list获取类的路径名称。

maven导入jar包:


            org.reflections
            reflections
            0.9.11
        
        
        
            com.google.guava
            guava
            21.0
        

一、用reflections的方式

      public static List clazzLis=new ArrayList();
		
		
			Reflections reflections=new Reflections("testsunmet.imp.*");
			//比如可以获取有Pay注解的class
			Set> classes=reflections.getTypesAnnotatedWith(Pay.class);

			for(Class cl:classes){
				Pay pay=cl.getAnnotation(Pay.class);
				clazzList.add(cl.getCanonicalName())//使用list把获取到的class路径装起来
			}
		}

二、使用递归file.list的方式

List 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(执行对象,方法参数)

 

你可能感兴趣的:(java相关)