问题描述
我要连续创建新类(特别是不同名称)的对象。
public static void main(String args[]) {
while (true) {
Object obj = getNewClassObject();
System.out.println(obj.getClass.getName());
}
}
public static Object getNewClassObject() {
// some code
}
任务是我们应该在方法中编写的内容,因此每次它返回一个不同类的Object,并且程序在每行中打印不同的类名称。
我尝试使用匿名类,内部类,lambdas等。但是它们都返回相同的类名。 我当前的“ lam”解决方案是在一个具有播放功能的应用程序中创建新的类文件(具有重装功能),然后使用反射库(或仅使用Java代码)加载类并获取新类的对象。
但是它要占用大量内存,而反射方法getSubTypeOf()则需要花费大量时间〜100秒,并且在一段时间后出现OutOfMemoryError。 我希望有一个更好的方法。我在想诸如卸载或释放类元数据以释放内存的事情。
解决方法
使用Javassist尝试
private static ClassPool pool = ClassPool.getDefault();
private static RandomString rs = new RandomString();
public static Object getNewClassObject() {
String name = rs.nextString();
Object obj = null;
try {
obj = pool.makeClass(name).toClass().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return obj;
}
RandomString
来自这里:How to generate a random alpha-numeric string?
pom.xml
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.27.0-GA</version>
</dependency>