使用javac永久存储字节码中的参数名-parameters<;类名>; 我在做什么

使用javac永久存储字节码中的参数名-parameters<;类名>; 我在做什么,java,reflection,command-line-interface,named-parameters,Java,Reflection,Command Line Interface,Named Parameters,我在代码中使用反射来解耦所有类,为此,我需要能够动态创建对象的实例。我通过文本匹配参数名称来输入数据来实现这一点。然而,要进行文本匹配,我需要访问正式参数名,而不是合成的arg0,arg1…,如果IsNamePresent返回false,我知道会创建这些名称 我所做的 我研究了如何获得正式名称(谷歌搜索:“当我编译启用了参数选项的java类时,这会使反射永远工作吗?还是在类运行时只工作一次?”这样的搜索结果没有任何用处)。我也尝试过类似于这里的搜索,看到了与javac相关的信息,其中一个问题是“

我在代码中使用反射来解耦所有类,为此,我需要能够动态创建对象的实例。我通过文本匹配参数名称来输入数据来实现这一点。然而,要进行文本匹配,我需要访问正式参数名,而不是合成的
arg0,arg1…
,如果
IsNamePresent
返回false,我知道会创建这些名称

我所做的 我研究了如何获得正式名称(谷歌搜索:“当我编译启用了参数选项的java类时,这会使反射永远工作吗?还是在类运行时只工作一次?”这样的搜索结果没有任何用处)。我也尝试过类似于这里的搜索,看到了与javac相关的信息,其中一个问题是“javac的缺点-参数标志”,作为一个例子。虽然这些回答了我问题的一部分,但它们确实没有回答我所需要的内容。我发现在Java8中,您只需执行“javac-parameters”,就可以了。请注意,我必须使用jdk的目录作为起点(我的命令行输入与此完全相同):

到目前为止,它没有任何错误,我的项目中有字节码编译文件,所以我知道它正在做一些事情。究竟是什么(或者如果它是上面的结果)对我来说是个谜,因为这些文件没有时间戳或任何我能找到的东西,指向我尝试过的命令(我已经尝试这些命令一段时间了)

问题范围的详细说明 我的问题是:这个命令行输入是获取形式参数的唯一方法吗。如果是这样,我做对了吗(正确的输入语法)?如果我做得对,那么我如何使它在调试代码并运行param.getName()时实际返回正式名称?到目前为止,我已经在命令行上运行了上述命令,并尝试在java代码中调试这一行:

Boolean check = param.isNamePresent();
其中param只是来自使用我通过反射得到的类的构造函数的for-each循环的参数。问题是,每次我运行它时,这个布尔值在调试器中返回false,并且名称是合成的(arg0、arg1等)。我希望它返回true(并实际使用正式名称),以便调试其余代码

如果这不是实现获取正式参数名这一既定目标的唯一方法,那么在哪里可以找到更好的方法?我看过一些框架的东西,也听说过Eclipse被用来做这件事,但是我不想为了完成一件事而深入研究新软件,我正在工作,所以我没有管理员权限(这就是为什么我需要直接在cmd中指定jdk,而不是仅仅以通常的方式设置路径变量)。这将使下载Eclipse之类的东西变得很麻烦

更新 我已经研究过使用注释来获取参数名,因为我不知道为什么编译后的类不会实际存储参数名。这个策略是在最初的回答中提出的(因为被删除了),我自己去学习一些基本的注释。它们在一定程度上起了作用,但现在我得到了一个错误的参数错误,我不应该这样做。我已经检查了调试器,传入的参数数量与所需数量相同,因此根据
newInstance(Object[])
方法的javadoc进行包装/展开时一定是类型错误。我希望能够初始化
null
参数,我认为这是我问题的根源(即null类型错误或其他一些但未显示为NPE的错误)。其他可能的来源包括这样一个事实:我正在传入一个
对象[]
,并在类中键入它(即
newInstance(Object[]array)
正在创建一个类的实例,该类具有字符串参数和
对象
的其他各种子类,包括数组列表)因为在这里询问这个错误将构成一个XY问题,所以我不会问,而只是描述一下,以澄清原始问题。我最初的问题仍然存在,即使这个解决方案正在进行中,因为我仍然想知道为什么使用-parameters标志编译这个类时没有存储参数名。我99%确定类路径是正确的,因为我从目录复制粘贴了它。这听起来很傻,但我真的必须使用下面的行来运行这个类吗

C:\Program Files\Java\jdk-10.0.1\bin>java C:\Users\abbotts1\IdeaProjects\project\src\Sales_Rep_Data\Data_Parser.java

我的印象是,使用parameters标志编译它就是您所需要的,然后正式的参数名就可以使用了。

“我在代码中使用反射来解耦所有类”。但是……为什么?你读过解耦是好的,所以你想把它发挥到极致吗?相关:我想学习依赖注入和解耦的精髓,有人告诉我这就是如何做到的。TBH我见过很多框架为你做类似的事情,但我认为这样做作为一个辅助项目有助于我了解所有这些是如何工作的。它真的教会了我很多关于DI、工厂模式、属性、反射等的知识。现在,如果我能熟练使用命令行的话……实际上,框架是通过注释来实现的,因为不能保证参数名是存在的,而且名称实际上是不相关的,因为重要的是类型。当你说你想学习高级事物的内部工作原理,但你没有合适的工具或对命令行的掌握时,这里有一点差距。此外,如果这是一个附带项目,你难道没有自己的电脑可以安装你想要的任何东西吗?我有,但我还没来得及移动文件,还有,工作之后,我不想编码,所以我会在工作时间编码,因为有时候,如果我只是在等待老板回复我的事情,我就什么也做不了。我宁愿做一些有成效的事情,也宁愿学习
C:\Program Files\Java\jdk-10.0.1\bin>java C:\Users\abbotts1\IdeaProjects\project\src\Sales_Rep_Data\Data_Parser.java