如何检查Java类中是否包含特定方法?

问题描述 投票:25回答:6

我有一个不断变化的xml模式(使用trang自动生成)。这些更改不是很详尽。从此架构中仅添加或删除一些元素。通过这种模式,我正在生成Java类(使用cxf),通过它们我将解组xml文档。

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

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

更新:

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

If method getElemA exists then 
     ElemA elemA = getElemA()

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

有什么方法可以使编译器在编译时不抱怨此功能?

java jaxb xsd
6个回答
42
投票

[@ 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更新


20
投票

使用reflection

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.
  }
}

10
投票

使用Spring:

Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
  //do what you want
}

4
投票

如果使用Spring Framework,最简单的方法是使用ReflectionUtils.findMethod()实用程序。



0
投票

另一种方法是使用Java 8流:

  Optional<Method> methodToFind =
                Arrays.stream(clazz.getMethods()).
                        filter(method -> "methodName".equals(method.getName())).
                        findFirst();
        if (methodToFind.isPresent()) {
            // invoke method or any logic needed
            ///methodToFind.get().
        }
© www.soinside.com 2019 - 2024. All rights reserved.