Проблема обнаружения типов объектов в Java

#java #object #types

#java #объект #типы

Вопрос:

Я нахожусь в процессе создания приложения, но я наткнулся на проблему.

Я создаю программу, которая будет генерировать файл .java в зависимости от пользовательского ввода. В программе вы сможете выбирать пользовательские API (хотя я не могу предоставить их вам). После того, как вы выбрали вызов API, вам нужно будет указать входные данные для этого метода. Вы также можете указать другой вызов API в качестве входных данных для текущего параметра. Я хочу показывать только вызовы api, которые предоставляют правильное возвращаемое значение в качестве входных данных для выбранного вызова api. Вот в чем проблема. Я могу определить тип ввода для параметров выбранных вызовов api, но, похоже, я не могу определить тип для параметра classValue, предоставленного listAPICallsWithReturnValue(…) . функция call.GetMethod() возвращает java.lang.reflect .Объект метода.

Я надеюсь, вы все вроде понимаете, что я имею в виду … 🙂

 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);

}
  

Ответ №1:

возможно:

classValue.getName()

classValue.getClass().getName() вернет «Class» (поскольку classValue имеет тип Class).

Ответ №2:

Я предлагаю просто распечатать getCanonicalName(), и вы увидите, что он не будет соответствовать toString () . На самом деле, getName будет соответствовать, если не очень близко, возможно, он не добавит слово «Класс» и т.д….

Возможно, используйте class.getName для обоих сравнений или дважды проверьте, что еще вам доступно….

Ответ №3:

попробуйте использовать 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);
}
  

}

Комментарии:

1. хорошо, спасибо всем за информацию. я попробую это сегодня вечером 🙂

2. a.getClass().isAssignableFrom(b.getClass()) может быть записан как a.getClass().isInstance(b)