java - 反射如何与静态和实例方法交互?
问题描述
我对Java非常陌生,经过几个小时的环顾后,我终于找到了一种在运行时使用反射创建新类实例的方法。问题是在反射的其他答案和解释中存在一定程度的模棱两可,因为人们解释了如何解决问题而不是为什么修复工作。
目前我能找到的最广泛的反射语法是:
Class clazz = Class.forName(fullClassPath);
Constructor<Color> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] {name});
但是有一些小问题,我主要是在理解方面遇到问题。在所有其他解释中,答案都是根据给出的错误手工定制的。就我而言,在尝试使用它时,我显然误解了它的工作方式。
public void createInstance() {
String name = name;
try {
Class clazz = Class.forName(fullClassPath);
Constructor<Color> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] {name});
} catch (Exception e) {
}
}
在我看来,这样做的方式是它会拉出当前类,使用它的构造函数,然后重命名实例(同时更改目录名称......我希望)。问题是这种解释中存在一些我认为不完全吻合的漏洞......
我应该提一下,这确实会引发错误并求助于 catch 语句而不是运行代码。
我希望反射需要一个实例方法才能正确运行它,以便它可以更改它所属的任何类的路径......但是必须在调用该方法之前创建一个实例,这将(在我看来)是笨拙,因此可能不正确。
在静态方法中,它必须从一个公共数据库中提取,这根本不会起作用。
给出的错误是:
java.lang.ClassNotFoundException: saveload.Colornull
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
(Irrelevant context removed)
更新:通过尝试在静态方法中构造类(并更改某些变量的提取位置),我能够找到一种似乎工作得更好的方法,我能够使它最终读取实际名称,将错误从:
java.lang.ClassNotFoundException: saveload.Colornull
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
etc...
至:
java.lang.ClassNotFoundException: (Name from user input here)
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
etc...
解决方案
推荐阅读
- pytorch - “自注意力机制”和“全连接”层有什么区别?
- python - 是否可以使用 google drive api 列出 Google Drive 中指定目录中的文件?
- javascript - 使用 HTML 和 Javascript 将两个数字相加
- python - Python 小测验的评分和评分系统
- android - React Native Android 网络不起作用
- c++ - Boost Beast 错误:sslv3 警告错误证书,当我尝试连接到 wss 服务器时
- matlab - Matlab 图像基线(偏移去除)校正
- flutter - Flutter Dropdown 表单域
- youtube-livestreaming-api - 插入新流时出现 500 错误
- calendar - 为什么在使用复杂的击键时需要延迟?