gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:28:08 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com