Java:有没有一种方法可以将文本转换为类?

3

我有一个输入:"ListClients param1 param2",它按照" "分割成"ListClients", "param1", "param2";

我想要调用ListClients的静态方法。

所以应该这样做:ListClients.someMethodThatTakesPraams(param1, param2);

在Java中有没有一种方法可以实现这个?


2
"magic"……有趣的标签选择。:D - Gordon Gustafson
1
我删除了魔术标签,因为它不适用。 - Tim Bender
4个回答

5

确实如此!您可以使用Class.getDeclaredMethod来查找给定名称和参数类型的Method对象。例如,要查找您的someMethodThatTakesParams方法,可以编写以下代码:

Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class);

在这里,ArgType1ArgType2是参数的类型。
一旦你有了这个方法,你可以按照以下方式调用它:
m.invoke(null, arg1, arg2);

在这里,arg1arg2是您想要传递的参数。请注意,调用invoke方法的第一个参数为null,因为该方法是静态的。

这种方法省略了您需要捕获的异常和可能需要获取的安全权限等各种奇怪的问题,但幸运的是,这些并不难掌握。


1
对于正确的答案加1。不幸的是,反射并不是这么简单的,需要考虑一些因素以避免调用任何可用的方法。你可以选择静态编码来指定哪些方法应该被调用。这需要更多的工作,但更加安全。 - OscarRyz
@OscarRyz - 非常好的观点。一般来说,反射是极度过度的。既然我不知道 OP 正在尝试做什么,我仍然支持这个答案,但我完全同意你的观点,静态分派会是一个更好的想法。 - templatetypedef
在这种情况下,您可以为我的答案点赞 :) :) :) ;) https://dev59.com/41PTa4cB1Zd3GeqPj4JY#4730192 - OscarRyz
@OscarRyz- 当前没有投票机会。我会尽快回来给你点赞的。 :-) - templatetypedef

3

您可以使用反射。以下是创建新实例的示例

Class<Object> fc = Class.forName("ListClients");
   Object myObj = fc.newInstance();

以下是一些调用方法的示例: (点击这里)

如果必须使用反射,我认为这是一个更简洁的答案。 - trillions

2
一种简单的硬编码方法是创建一个if / else链并调用正确的方法:
String input = "ListClients param1 param2";
String [] args = input.split(" ");
switch( args.length ) { 
    case 0: 
       return ListClients.someMethod();
    case 1: 
       return ListClients.someMethod( args[0] );
    case 2: 
        return LIstClients.someMethod( args[1] );
    default: 
         return // something default         
}

这句话的意思是:“虽然这似乎有些过时,但非常安全,因为你可以精确地编写代码调用方式。”
第二句话的意思是:“另一种解决方案涉及使用反射,正如其他人所提到的:”。
String input = "ListClients param1 param2";
String [] args = input.split(" ");
Class[] types = new Classs[ args.length ];
Object[] values = new Object[ args.lenght ];
for( int i = 0 ; i < types.lenght ; i++ ) { 
   types[i] = String.class;
   values [i] = args[i];
 }   

ListClients.class
   .getDeclaredMethod("someMethod", types )
   .invoke( null, values );

所有这些都被一些反射检查异常所包围。
您应该考虑您的应用程序需要多么动态,以及/是否需要采取措施来防止类似于这样的野生调用:"System.exit(0)" 被调用或任何其他形式的代码注入

-1

反射将成为你的好朋友。


+1 因为我认为这篇帖子不应该被踩。尽管仅发布教程链接而没有解释肯定不是最有帮助的事情。 - Tim Bender
@Tim Bender 我同意,但有些东西你可以放心使用,而不需要了解太多,也有些东西如果你不理解就会让你的代码彻底崩溃。反射绝对属于第二类。此外,我认为楼主会觉得整个概念的名称很有用。 - biziclop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接