如何检查Java类中是否有特定的方法?

2022-09-01 09:14:39

我有一个xml模式(使用trang自动生成),它不断变化。这些变化不是很详细。仅在此架构中添加或删除某些元素。从这个模式中,我正在生成java类(使用cxf),通过它我将取消xml文档的元化。

随着模式的更改,我自动生成的 java 类也会更改。同样,与模式一样,java类的变化不是很大。例如,如果将元素 say 添加到架构中;一些相关的函数说并添加到自动生成的java类中。elemAgetElemA()setElemA()

现在,我如何确保这些自动生成的类中存在特定函数?一种解决方案是手写架构,以便涵盖 xml 的所有可能元素。这就是我最终要做的。但就目前而言,我还没有修复xml文件的格式。

更新:

有可能在自动生成的类中定义方法。我无法控制这些类的自动生成。但是在我的主类中,如果有以下代码,getElemA()

If method getElemA exists then 
     ElemA elemA = getElemA()

此代码将始终存在于我的主类中。如果方法在其中一个自动生成的类中生成,则没有问题。但是,如果未生成此方法,则编译器会抱怨此方法在任何类中都不存在。getElemA()

有什么方法可以让编译器在编译时不抱怨这个函数吗?


答案 1

@missingfaktor提到了一种方法,下面提到了另一种方法(如果您知道api的名称和参数)。

假设您有一个不带参数的方法:

Method methodToFind = null;
try {
  methodToFind = YouClassName.class.getMethod("myMethodToFind", (Class<?>[]) null);
} catch (NoSuchMethodException | SecurityException e) {
  // Your exception handling goes here
}

如果存在,请调用它:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, (Object[]) null);
}

假设您有一个采用本机参数的方法:int

Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { int.class });

如果存在,请调用它:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
      Integer.valueOf(10)));
}

假设您有一个采用盒装参数的方法:Integer

Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { Integer.class });

如果存在,请调用它:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
      Integer.valueOf(10)));
}

使用上面的soln调用方法不会给你带来编译错误。根据@Foumpie更新


答案 2

使用反射

import java.lang.reflect.Method;

boolean hasMethod = false;
Method[] methods = foo.getClass().getMethods();
for (Method m : methods) {
  if (m.getName().equals(someString)) {
    hasMethod = true;
    break;
  }
}

编辑:

因此,您希望调用该方法(如果存在)。这是你如何做到的:

if (m.getName().equals(someString)) {
  try {
    Object result = m.invoke(instance, argumentsArray);
    // Do whatever you want with the result.
  } catch (Exception ex) { // For simplicity's sake, I am using Exception.
                           // You should be handling all the possible exceptions
                           // separately.
    // Handle exception.
  }
}

推荐