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