【问题标题】:How to map String to Java class? [duplicate]如何将 String 映射到 Java 类? [复制]
【发布时间】:2014-03-10 00:59:16
【问题描述】:

我想将一个字符串映射到一个 Java 类。 例如,我想定义我的 Main 类,使其按以下方式工作:

$ java Main SayHello
Hello!
$ java Main SayBye
Bye!
$ java Main SayHola
Error: No such class exists

这里是代码。

public class Main {
    public static void main(String[] args) {
        // Call args[0].say()
    }
}

public class SayHello {
    public static void say() {
        System.out.println("Hello!");
    }
}

public class SayBye {
    public static void say() {
        System.out.println("Bye!");
    }
}

我知道我可以通过手动将 args[0] 的每个可能值映射到 Java 类来做到这一点,例如:

if (args[0].equals("SayHello")) {
    SayHello.say();
}

但是有没有办法自动做到这一点?

【问题讨论】:

标签: java class


【解决方案1】:

你可以这样做:

public static void main(String[] args) {
    final String className = "com.my.package." + args[0];
    try {
        Class<?> clazz = Class.forName(className);
        Method method = clazz.getMethod("say");
        Object object = clazz.newInstance();
        method.invoke(object);
    } catch (ClassNotFoundException e) {
        System.err.println("Error: No such class exists");
    } catch (SecurityException e) {
        System.err.println("Error: You are not allowed to do that");
    } catch (NoSuchMethodException e) {
        System.err.println("Error: No such method exists");
    } catch (InstantiationException e) {
        System.err.println("Error: Unable to instantiate");
    } catch (IllegalAccessException e) {
        System.err.println("Error: No access to class definition");
    } catch (IllegalArgumentException e) {
        System.err.println("Error: Illegal argument");
    } catch (InvocationTargetException e) {
        System.err.println("Error: Bad target");
    }
}

注意:由于您的 say() 方法是静态的,您可以替换:

        Object object = clazz.newInstance();
        method.invoke(object);

作者:

        method.invoke(null);

【讨论】:

    【解决方案2】:

    我在这里找到了答案Creating an instance using the class name and calling constructor

    你可以通过它的名字来调用类

    Class<?> clazz = Class.forName(className);
    Constructor<?> ctor = clazz.getConstructor(String.class);
    Object object = ctor.newInstance(new Object[] { ctorArgument });
    

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2019-10-01
      • 2015-12-08
      • 2021-11-20
      • 2021-12-24
      相关资源
      最近更新 更多