我的程序有两个部分,一个是数据结构,另一个是第二个操作。
数据结构部分基本上是对象&那个对象的集合。该集是一个扩展ArrayList的类。 Set和Objects是唯一的,我的意思是如果我有一个名为A的类,那么我有一个Set,它保存所有A对象。
操作部分正在对这些集合进行一些操作,并且大多数时候它也在运行时创建一个新类(在java文件中编写类并编译它然后从Reflect库函数调用它,例如constructor.newInstance( args);)并从新类创建一个对象然后填充它并返回它。由于我不想覆盖类,因此我使用UUID修剪来命名在运行时创建的新类。
我注意到一些奇怪的事情。我运行我的代码并且它有效,然后我再次运行它并在创建set时,它给了我" java.lang.IllegalArgumentException:错误的参数数量"。我再次运行它异常,一次又一次然后我再次运行它然后没有异常。 (每当它创建一个像我想要的新类时)
那么为什么我的代码可以这样做?
我在Ubuntu 14.04上使用Oracle Java 1.8和Intellij Idea(也试过Eclipse没有变化)。
编辑代码: "我删除了与问题无关的代码"
这是我操作中出错的部分; (初始innerInnerName是随机生成的类名)
final String outerClassName = "" + initialInnerName + "Table";
final String innerClassName = "" + initialInnerName;
File file = new File("./src/");
URL url = file.toURI().toURL();
URL urls[] = new URL[]{url};
URLClassLoader loader1 = new URLClassLoader(urls);
Class<?> innerClass = loader1.loadClass(innerClassName);
Set<Template> newTable = null;
Class<?> outerClass = loader1.loadClass(outerClassName);
Constructor<?> constructorOfOuterClass = outerClass.getDeclaredConstructors()[0];
Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);
修改2
在最后一行代码的最后一行抛出异常:
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);
我曾尽可能地尝试过MCVE。
答案 0 :(得分:1)
你的&#34;外课&#34;有两个构造函数,一个接受一个参数,另一个接受两个。当你去实例化外部类时,你会得到构造函数列表中的第一个:
Constructor<?> constructorOfOuterClass = outerClass.getDeclaredConstructors()[0];
然后你尝试用两个参数调用它:
Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);
问题在于构造函数不一定按照您期望的顺序。没有特定的顺序可以保证,所以有时你会得到一个参数构造函数,有时候会得到两个参数构造函数。当你得到两个参数构造函数时,一切都很好。但是当你得到一个参数构造函数并用两个参数调用它时,那么你就会非常清楚会发生什么。
您需要确定哪个构造函数是您想要的构造函数,然后选择它,而不是假设它是列表中的第一个构造函数。