Java 使用接口和反射API在运行时创建实例是一个代价高昂的选项

Java 使用接口和反射API在运行时创建实例是一个代价高昂的选项,java,performance,reflection,interface,Java,Performance,Reflection,Interface,我遇到过这样的情况,实现接口的类需要从表中动态地选取。此类的绝对路径将在表中配置。将从表中选取类名,然后使用反射API创建并执行该类的实例 我假设当多个线程访问这个程序时会创建许多实例,这可能会占用大量内存,并且可能会影响性能。我的假设正确吗?有什么办法来处理我在这里的情况吗 以下是代码片段: Class<?> c = Class.forName(dynamicClass); ServiceValidatorInterface inst = (ServiceV

我遇到过这样的情况,实现接口的类需要从表中动态地选取。此类的绝对路径将在表中配置。将从表中选取类名,然后使用反射API创建并执行该类的实例

我假设当多个线程访问这个程序时会创建许多实例,这可能会占用大量内存,并且可能会影响性能。我的假设正确吗?有什么办法来处理我在这里的情况吗

以下是代码片段:

Class<?> c = Class.forName(dynamicClass);            
ServiceValidatorInterface inst = (ServiceValidatorInterface) c.newInstance();
inst.validateService(serviceDetails);
Class c=Class.forName(dynamicClass);
ServiceValidatorInterface inst=(ServiceValidatorInterface)c.newInstance();
安装验证服务(服务详情);

创建实例需要内存,无论您如何创建实例,因此这与问题无关

至于性能影响,通过
newInstance()
创建实例当然与直接调用构造函数不同,但这真的会对您产生影响吗?此外,如果要反复创建同一类的实例,可以将它们合并在一起,以便只创建一次。您只需确保这些类是无状态的,并且可以共享


不要过于匆忙地担心性能影响。现在是2018年,我们拥有有史以来最强大的计算机,但人们提前担心(通常没有理由)无关紧要的事情。要知道某个对象是否具有可接受的性能,唯一的方法是对其进行度量,除非先编写代码,否则无法进行度量。

如果要基于某个输入和类输出进行一对一映射,则不一定需要在请求时创建该表。就内存而言,一旦方法离开,实例将超出范围,不是吗?嗨,Dave,谢谢你的评论。1.还有一个程序根据某些条件从表中提供类名。该表将有许多为不同目的配置的类,但它们都实现了相同的接口。2.我创建的实例将一直存在,直到它被垃圾回收,对吗?但我不确定:)是的,它会一直在那里,直到它的GCed。任何JVM对象都是如此,不管它是如何实例化的。有更好的方法可以做到这一点,根本不使用反射。我假设实现ServiceValidator接口的类数量有限。因此,创建一个枚举(可能称为ValidatorType),将枚举值存储在数据库中(在字符字段中),并在应用程序中保留一个静态映射。每个供应商值都将是一个构造函数引用,例如
AlbatrossServiceValidator::new