检测java问题中的对象类型

发布于 2024-11-09 01:44:15 字数 1739 浏览 0 评论 0原文

我正在创建一个应用程序,但我偶然发现了一个问题。

我正在创建一个程序,它将根据用户输入生成 .java 文件。 在程序中,您将能够选择自定义 api(但无法向您提供)。 选择 API 调用后,您必须指定该方法的输入。您还可以指定另一个 API 调用作为当前参数的输入。 我只想显示提供正确返回值作为所选 api 调用输入的 api 调用。 问题就在这里。我可以检测所选 api 调用的参数的输入类型,但我似乎无法检测提供给 listAPICallsWithReturnValue(...) 的 classValue 参数的类型。 call.getMethod() 函数返回一个 java.lang.reflect.Method 对象。

我希望你们都明白我的意思......:)

public void displayParameterDialogs(APICall call) {
    JDialogMethodParameters dialog = new JDialogMethodParameters(mainframe, true);
    for (int i = 0; i < call.getMethod().getParameterTypes().length; i++) {
        dialog.init(i, call.getMethod().getParameterTypes()[i]);
        dialog.setVisible(true);
    }
}
//dialog class
public void init(int parameterIndex, Class parameterType) {

    this.jLabelInfo.setText("Data for input parameter: " + parameterIndex);

    DefaultComboBoxModel cmodel = new DefaultComboBoxModel();
    for (APICall call : TestFactory.getInstance().listAPICallsWithReturnValue(parameterType)) {
        cmodel.addElement(call);
    }

    this.jComboBox1.setModel(cmodel);
}
public APICall[] listAPICallsWithReturnValue(Class<?> classValue) {
    APICall[] calls;
    Vector<APICall> temp = new Vector<APICall>();
    Method[] methods = TestSuite.class.getMethods();

    for (Method method : methods) {
        System.out.println(method.getReturnType().getName());
        System.out.println(classValue.getClass().getName());
        System.out.println(classValue.toString());
        if (method.getReturnType().getCanonicalName().equals(classValue.toString())) {
            temp.add(new APICall(method));
        }
    }

    calls = new APICall[temp.size()];
    return temp.toArray(calls);

}

I'm in the process of creating an application but i've stumbled upon a problem.

I'm creating a program that will generate a .java file depending on the user input.
In the program you'll be able to select custom api's (can't provide them to you though).
Once you've selected an API call you'll have to specify the input for that method. You can also specify another API call as the input for the current parameter.
I only want to show the api calls that provide the correct return value as an input for the selected api call.
Here's the problem. I can detect the input type for the parameters of the selected api calls, but i can't seem to detect the type for the classValue parameter provided to listAPICallsWithReturnValue(...).
the call.getMethod() function returns a java.lang.reflect.Method object.

I hope you all kinda understand what i mean... :)

public void displayParameterDialogs(APICall call) {
    JDialogMethodParameters dialog = new JDialogMethodParameters(mainframe, true);
    for (int i = 0; i < call.getMethod().getParameterTypes().length; i++) {
        dialog.init(i, call.getMethod().getParameterTypes()[i]);
        dialog.setVisible(true);
    }
}
//dialog class
public void init(int parameterIndex, Class parameterType) {

    this.jLabelInfo.setText("Data for input parameter: " + parameterIndex);

    DefaultComboBoxModel cmodel = new DefaultComboBoxModel();
    for (APICall call : TestFactory.getInstance().listAPICallsWithReturnValue(parameterType)) {
        cmodel.addElement(call);
    }

    this.jComboBox1.setModel(cmodel);
}
public APICall[] listAPICallsWithReturnValue(Class<?> classValue) {
    APICall[] calls;
    Vector<APICall> temp = new Vector<APICall>();
    Method[] methods = TestSuite.class.getMethods();

    for (Method method : methods) {
        System.out.println(method.getReturnType().getName());
        System.out.println(classValue.getClass().getName());
        System.out.println(classValue.toString());
        if (method.getReturnType().getCanonicalName().equals(classValue.toString())) {
            temp.add(new APICall(method));
        }
    }

    calls = new APICall[temp.size()];
    return temp.toArray(calls);

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

趴在窗边数星星i 2024-11-16 01:44:15

也许:

classValue.getName()

classValue.getClass().getName()将返回“Class”(因为classValue是Class类型)。

perhaps:

classValue.getName()

classValue.getClass().getName() will return "Class" (since classValue is of type Class).

风透绣罗衣 2024-11-16 01:44:15

我建议简单地打印出 getCanonicalName(),您会发现它与 toString() 不匹配。事实上,如果不是很接近, getName 也会匹配,也许它不会添加单词“Class”等......

也许使用 class.getName 进行比较或仔细检查还有什么可用......

I suggest simply printing out getCanonicalName() and you will see it won't match toString(). In fact, getName will match if not very close, maybe it wont add the word "Class" etc....

Perhaps use class.getName for both comparisons or double check what else is available to you....

蓝色星空 2024-11-16 01:44:15

尝试将 getClass()isAssignableFrom() 结合使用,

示例:

public class Main {

static class A {}
static class B extends A {}

public static void main(String[] args) {
    Object a = new A();
    Object b = new B();

    boolean aAssignableFromB = a.getClass().isAssignableFrom(b.getClass()); // true
    boolean bAssignableFromA = b.getClass().isAssignableFrom(a.getClass()); // false

    System.out.println(aAssignableFromB);
    System.out.println(bAssignableFromA);
}

}

try using getClass() in conjunction with isAssignableFrom()

example:

public class Main {

static class A {}
static class B extends A {}

public static void main(String[] args) {
    Object a = new A();
    Object b = new B();

    boolean aAssignableFromB = a.getClass().isAssignableFrom(b.getClass()); // true
    boolean bAssignableFromA = b.getClass().isAssignableFrom(a.getClass()); // false

    System.out.println(aAssignableFromB);
    System.out.println(bAssignableFromA);
}

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文