Java實現一個類容器
阿新 • • 發佈:2021-07-16
首發於Enaium的個人部落格
新建2個類
public class Test1 {
}
public class Test2 {
public void render() {
System.out.println("Test2");
}
}
public class ClassContainer { private final HashMap<Class<?>, Object> classes = new HashMap<>(); public ClassContainer() { List<Class<?>> scanClasses = new ArrayList<>(List.of(Test1.class));//被掃描到的類 上個文章介紹瞭如何遍歷類路徑所有類 scanClasses.forEach(it -> { try { classes.put(it, it.getConstructor().newInstance());//建立物件 直接newInstance的方法被棄用 所以需要獲取無參構造方法再建立物件 } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } }); } public <T> T create(Class<T> klass, Object instance) { classes.put(klass, instance); return (T) classes.get(klass); } public <T> T create(Class<T> klass) { if (classes.get(klass) == null) {//如果這類沒物件的話就建立 try { classes.put(klass, klass.getConstructor().newInstance()); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); } } return (T) classes.get(klass);//返回物件 } public HashMap<Class<?>, Object> getClasses() { return classes; } }
測試一下
public class Main { private static final ClassContainer classContainer = new ClassContainer(); public static void main(String[] args) { System.out.println(classContainer.create(Test2.class));//第一次建立 System.out.println(classContainer.create(Test2.class));//第二次建立和第一次建立物件相同 System.out.println(classContainer.create(Test2.class, new Test2()));//容器內的類被重新建立 for (Map.Entry<Class<?>, Object> classObjectEntry : classContainer.getClasses().entrySet()) { System.out.println(classObjectEntry.getKey());//遍歷容器內的類 } } }