Java:有没有办法将文本转换成类?

Java:有没有办法将文本转换成类?,java,reflection,Java,Reflection,我有输入:“ListClients param1 param2” 按”拆分为“列表客户端”、“参数1”、“参数2” 我想从ListClient调用一个静态方法 所以它会做ListClients.somemethodthatakesRams(param1,param2) 在java中有这样做的方法吗?将是您的朋友。是的,您可以使用反射。下面是创建新实例的示例 Class<Object> fc = Class.forName("ListClients"); Object myObj

我有输入:
“ListClients param1 param2”
拆分为
“列表客户端”、“参数1”、“参数2”

我想从ListClient调用一个静态方法

所以它会做
ListClients.somemethodthatakesRams(param1,param2)


在java中有这样做的方法吗?

将是您的朋友。

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

Class<Object> fc = Class.forName("ListClients");
   Object myObj = fc.newInstance();
Class fc=Class.forName(“ListClient”);
对象myObj=fc.newInstance();

下面是一些

是的!您可以使用
Class.getDeclaredMethod
查找给定名称和参数类型的
方法
对象。例如,要找到使用SPARAM的
方法,您可以编写

Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class);
这里,
ArgType1
ArgType2
是参数的类型

拥有该方法后,可以按如下方式调用它:

m.invoke(null, arg1, arg2);
其中,
arg1
arg2
是要传递的参数。请注意,
invoke
的第一个参数是
null
,因为该方法是静态的


这种方法省去了各种各样的奇怪之处,除了您必须捕获的异常和您可能必须获取的安全权限,但幸运的是,这些并不难识别。

简单的硬编码方法是创建一个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 );
String input=“ListClients param1 param2”;
字符串[]args=input.split(“”);
类[]类型=新类[args.length];
对象[]值=新对象[args.lenght];
对于(int i=0;i
所有这些都被许多反射检查异常所包围


您应该考虑您需要应用程序的动态性,和/或如果您要做些什么来防止这样的疯狂调用:“Stutal.Exchange(0)”被调用或任何其他类型。p> “魔力”…有趣的标签选择:DI删除了魔术标签,因为它不适用于正确答案的+1。不幸的是,反射并不是这么简单,应该考虑避免调用任何可用的方法。您也可以静态编写可以调用/应该调用哪些方法。它需要更多的工作,但更安全。@OscarRyz-这是一个很好的观点。总的来说,反思是一种极大的矫枉过正。由于我不知道OP想要做什么,我仍然坚持这个答案,尽管我完全同意你的观点,静态调度是一个更好的主意。在这种情况下,你可以投票支持我的答案:):;)@OscarRyz-目前没有选票。我会尽力记住,一旦我把它们拿回来,就要投上一票。:-)+1因为我认为这篇文章不值得投反对票。虽然仅仅发布一个教程链接而不做任何解释肯定不是最有帮助的事情。@Tim Bender我接受这一点,但是有些东西你可以安全地使用,而不需要真正了解它们,如果你不理解它们,你也可以使用它们来修改代码。反思绝对属于第二类。此外,我认为OP会发现整个概念的名称很有用。)如果必须使用反射,我认为这是一个更清晰的答案。