1、获取指定包的路劲
2、根据路劲获取所有实体类的.class文件
3、我们使用ClassLoader来获取资源的URL,然后根据URL获取对应的文件夹。最后,我们使用过滤器来筛选出所有以".class"结尾的文件
获取entity包下所有的实体进行映射
1.包的路劲:com.amarsoft.lease.fhProject.entity
2.获取
public static List<String> getObject(String packName){
//获取指定包的路劲
String path = packName.contains("/") ? packName:packName.replace(".", "/");
//根据路劲获取所有实体类的.class文件
//我们使用ClassLoader来获取资源的URL,然后根据URL获取对应的文件夹。最后,我们使用过滤器来筛选出所有以".class"结尾的文件。
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URL resource = contextClassLoader.getResource(path);
File file1 = new File(resource.getFile());
File[] files = file1.listFiles(file -> file.getName().endsWith(".class"));
List<String> objects = new ArrayList<>();
for(File file : files){
String substring = file.getName().substring(0, file.getName().length() - 6);
//将class文件转为类名
objects.add(packName+"."+substring);
}
return objects;
}
3.测试
public static void main(String[] args) {
//接口请求到了一些数据
MapData mapData=new MapData();
mapData.put("ajlcId","12121212");
mapData.put("ProjectManageId","aaaaaa");
String packageName = "com.amarsoft.lease.fhProject.entity";
List<String> objects = getObject(packageName);
for (String clazz : objects) {
try{
//反射
Class<?> loadedClass = Class.forName(clazz);
Table tableAnnotation = loadedClass.getAnnotation(Table.class);//@Table(name = "表名")
String name = tableAnnotation.name();//表名
Object o = loadedClass.newInstance();
System.out.println("对象"+o);
System.out.println("表名:"+name);
//假设设置一种类型type(几种实体类区分标志)
//对应表里的字段存在一种类型为zxgg name="FHFK_ZXGG"
String type = "zxgg";
if(name.split("-")[1].toLowerCase().equals(type)){
//落库
BeanKit.copyProperties(mapData,o);
}
}catch (Exception r){
}
}
}
简介 loadedClass.newInstance()
工厂模式下的一种创建对象的方式,为了防止代码冗余,避免了多个实体都去使用new A创建对象而设计的,
反射之后拿到该实体的对象