【发布时间】:2026-02-07 01:00:02
【问题描述】:
我遇到过需要从表中动态选择实现接口的类的情况。该类的绝对路径将在表中配置。将从表中选择类名,然后使用反射 API 创建和执行该类的实例。
我假设当多个线程访问该程序时会创建许多实例,这可能会占用大量内存并且可能会对性能产生影响。我的这个假设是对的吗?有什么办法可以处理我这里的情况吗?
下面是sn-p的代码:
Class<?> c = Class.forName(dynamicClass);
ServiceValidatorInterface inst = (ServiceValidatorInterface) c.newInstance();
inst.validateService(serviceDetails);
【问题讨论】:
-
如果您基于某些输入和类输出进行一对一映射,则不一定需要在请求时创建该表。就内存而言,一旦离开方法,实例就会超出范围,不是吗?
-
嗨戴夫,感谢您的评论。 1. 还有一个程序根据某些条件从表中提供类名。该表将配置许多用于不同目的的类,但它们都实现相同的接口。 2. 我创建的实例会一直存在,直到它被垃圾回收,对吧?不过我不确定:)
-
是的,它会一直存在,直到它被 GCed。 任何 JVM 对象都是如此,无论它是如何实例化的。
-
有更好的方法可以做到这一点,根本不会使用反射。我假设您实现 ServiceValidatorInterface 的类数量有限。因此,创建一个枚举(可能称为 ValidatorType),将枚举值存储在您的数据库中(在一个字符字段中),并在您的应用程序中,保持一个静态的
Map<ValidatorType, Supplier<ValidatorType>>。每个供应商值都是一个构造函数引用,例如AlbatrossServiceValidator::new。
标签: java performance reflection interface