package project.demo; import java.io.File; import java.io.FileFilter; import java.net.URL; import java.util.HashMap; import java.util.Map; import Spring.demo.demo; public class annot { private Map<String, Object> bmap = new HashMap<>(); /* * 3.尝试基于注解的形式写一个Spring工厂 1) 给定一个包,包中几个类 2) 定义一个工厂,扫描指定包中的类 3) 基于反射构建所有类的对象 * 4) 将对象存储于工厂对应的容器中(Map类型) */ public annot() { String pkg = "project.demo"; scanpkg(pkg); } // 扫描指定包,找到包中的类文件 private void scanpkg(String pkg) { // 1 替换包中的. ,为目录路径 String pkgd = pkg.replaceAll("\\.", "/"); System.out.println("00--"+pkgd); // project/demo(包名) // 2 获取目录结构在类路径中的位置(URL中封装了你具体资源路径) URL url = getClass().getClassLoader().getResource(pkgd); // System.out.println("url:"+url); // // file:/D:/workspace/day3-1/bin/project/demo // 3 构建一个文件对象 File file = new File(url.getFile()); // System.out.println("file:"+file); // // D:\workspace\day3-1\bin\project\demo // 4 获取目录指定.class文件 File fs[] = file.listFiles(new FileFilter() { public boolean accept(File file) { // 获取文件名 String fname = file.getName(); System.out.println("1---" + fname); // serdemo.class // 判断是否是目录 if (file.isDirectory()) { System.out.println("开始递归:"+pkg + "." + fname); scanpkg(pkg + "." + fname); // 包名+类名 } else { // 判断文件的后缀是否是.class if (fname.endsWith(".class")) { return true; } } return false; } }); for (File f : fs) { // 1获取文件名 String fname = f.getName(); System.out.println("2--" + fname); // serdemo.class // 2 获取去除.class 以后的文件名 String str = fname.substring(0, fname.lastIndexOf(".")); System.out.println("3--" + str); // serdemo // 3将名字的第一个字母转换小写(用它作为key存储map) String key = String.valueOf(fname.charAt(0)).toLowerCase() + str.substring(1); System.out.println("4--" + key); // 4构建一个类全名(包名.类名) String pkgcls = pkg + "." + str; System.out.println("5--" + pkgcls); try { // 通过反射构建对象 Class<?> c=Class.forName(pkgcls); if(c.isAnnotationPresent(demo.class)){ Object obj=c.newInstance(); System.out.println("创建的对象:"+obj); // 将对象存储到map容器中 bmap.put(key, obj); } //Object obj = Class.forName(pkgcls).newInstance(); //System.out.println("6--" + obj); } catch (Exception e) { throw new RuntimeException(e); } } } public Object getBean(String key) { return bmap.get(key); } public void close() { bmap.clear(); bmap = null; } public static void main(String[] args) { annot at = new annot(); Object obj=at.getBean("condemo"); System.out.println("obj="+obj); at.close(); } } |
|