首页 > 解决方案 > 反射如何与静态和实例方法交互?

问题描述

我对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...

标签: javareflectioninstantiation

解决方案


推荐阅读