java - 如何动态调用Java中的方法

标签 java

我对 Java 还很陌生,所以请彻底。我正在创建一个程序,该程序使用方法库通过各种正则表达式搜索文本文件。检查列表可能会根据文本文件的类型而变化(文本文件是网络设备配置文件)。某些检查适用于某些设备,不适用于其他设备。每个检查都是通过调用其方法来执行的。我遇到的问题是因为所有检查都不适用,而且我不知道哪些检查在运行时适用。因此,当用户选择要检查的设备时,我需要能够使用运行时创建的列表中的字符串来调用方法。 例如: 我想我需要能够使用字符串调用方法 我的列表内容确定执行哪些检查

String[] checklist = {"check100", "check101", "check105"}; // list of checks to perform  
String chk = checklist[0]; // String containing a check to be performed (Function Call)
chk(config); // Where it all goes wrong...  I want to make a call to the check100 method using the value of chk  
...  

public void check100 (String[] configFile){ // performs the configFile check100   
...  
...  
}  

public void check101 (String[] configFile){ // performs the configFile check101     
...  
...  
}  
public void check103 (String[] configFile){ //  check not applicable to this device   
...  
...  
}  `

我尝试过查看反射,但似乎无法弄清楚。如果有更好的方法在不使用反射的情况下做到这一点,请告诉我。

最佳答案

解决方案 1:

这可以使用 Java 的 Reflection API 来完成

public static void checkAll( String[] checks, String[] configFile ) {
    Class< ? > cl = Check.class; // Class object where all check methods are.
    for( String check : checks ) {
        Method m = cl.getMethod( check );
        m.invoke( null, configFile );
    }
}

在考虑这种方法之前,您应该阅读一些警告。我没有添加任何错误处理,该代码将无法编译。 Reflection API 可能会抛出许多我没有涉及的潜在异常。您应该仔细阅读所使用的每种方法,并考虑如何处理每个潜在的错误。

另一个警告是反射很慢,它比直接静态调用每个方法慢得多。如果您担心性能或类型安全,请考虑使用解决方案 2。

解决方案 2:

更好的解决方案是为每个检查使用通用接口(interface),例如。

public interface Check {
    void check( String[] configFile );
}

然后,您创建一堆实现该接口(interface)的类,并将它们添加到一个 Map 中,您可以在其中使用名称或 id 来查找您希望运行的每个检查。这比基于反射的方法快得多并且类型安全。

示例:

public class Check1 implements Check {

    public void check( String[] configFile ) {
        // Do check stuff
    }
}

public class Check2 implements Check {

    public void check( String[] configFile ) {
        // More check stuff
    }
}

public class ConfigCheck {
    public static Map< String, Check > nameToCheck = new HashMap< String, Check >();

    public static void invokeChecks( String[] checks, String[] configFile ) {
        for( String check : checks ) {
            nameToCheck.get( check ).check( configFile );
        }
    }
}

解决方案 3:

解决方案 3 与解决方案 2 类似,但您可以抽象出计划检查的每种配置类型,而不是抽象每次检查。然后,每种类型将负责调用对文件的所有必需检查。

public interface ConfigType {

    void check( String[] configFile );

}

public class TxtConfig implements ConfigType {

    public void check( String[] configFile ) {
        // Place calls to all required checks.
        // check100( configFile );
        // check101( configFile );
    }
}

public class XMLConfig implements ConfigType {

    public void check( String[] configFile ) {
        // Place calls to all required checks for XML configs
        // check101( configFile );
        // check102( configFile );
    }
}

IMO,这是一个非常干净的解决方案,并且可以扩展接口(interface),其中每个 ConfigType 子类可用于确定它可以检查哪些配置文件。它还提供了其他两种解决方案所不提供的更高程度的灵 active 。就像仅在之前的检查“失败”时才进行某些检查。它还减少了解决方案 2 中所需的子类数量。您仍然可以在不同的配置类型之间共享检查方法,而不需要额外的工作。

关于java - 如何动态调用Java中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25321134/

相关文章:

java - 从字段获取对象

java - JDBC 批量插入很慢!我的意思是,真的很慢?

java - 列表数组输出和 IBM 的 Watson Java SDK

java - Spring中的config.properties是什么以及它有什么用

java - 如何获取方法继承信息?

java - Gson:如何在没有注释的情况下从序列化中排除特定字段

java - 我应该把我的java代码放在哪里?

java - 跨所有线程清除数组

java - Java 中的类组织

java - InvalidGrantException,运行两个(或更多)Spring OAuth Server 时授权代码无效