Java,反射,从类中获取方法



我在Java中使用反射时遇到了一些问题。我试图保存一个数据结构的方法,但遇到了一个错误。错误为

java.lang.NoSuchMethodException: cs671.eval.SerialList.add(java.lang.Integer, java.lang.String)

在本例中,我试图获得的方法是SerialList的add方法,该方法将Comparable和Object作为其参数。

structType = "cs671.eval.SerialList"keyType = "java.lang.Integer"valType = "java.lang.String"是从文件中读取的字符串。

Class dataClass = null, comparableClass = null, objectClass = null;
try{ // create data structure
    dataClass = Class.forName(structType); 
    comparableClass = Class.forName(keyType);
    objectClass = Class.forName(valType);
}
catch(ClassNotFoundException e){}
java.lang.Object structObj = null;
try{ // Create a data structure object
    structObj = dataClass.newInstance();
}
catch(Exception e){}
Method m = null;
try{ // Attempt to get add method for the data structure
    m = dataClass.getMethod("add", comparableClass, objectClass); // This is where it fails
}
catch(Exception e){}

基本上,我试图在正确的数据结构上获得正确的方法,并将正确的类传递到该方法中,但我不知道如何告诉getMethod方法这些类(comparableClass和objectClass)是正确的。

提前感谢!

Added:这是SerialList的add方法签名public void add(java.lang.Comparable, java.lang.Object)

你说的是-

在本例中,我试图获得的方法是SerialList的add方法,该方法以ComparableObject为参数。

但是通过了类java.lang.Integerjava.lang.String


请注意,只有公共方法对getMethod()可见,对于非公共方法,您必须使用getDeclaredMethod()

来源http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class…%29:

要在类C中找到匹配的方法:如果C只声明了一个具有指定名称的公共方法,并且具有完全相同的形式参数类型,则这就是所反映的方法。如果在C中找到多个这样的方法,并且其中一个方法的返回类型比其他任何方法都更具体,则会反映该方法;否则任意选择其中一种方法。

=>您需要通过java.lang.Comparable.class&java.lang.Object.class

对之前提供的错误答案表示歉意。根据您的评论,您似乎试图通过避免在方法的签名中提供所需的特定参数类型来获得该方法。

如果我的理解是正确的,那么您应该使用Class#getMethods()并检查返回的Method[]作为您的方法。考虑这样的骨架代码:

Method[] methods = dataClass.getMethods();
boolean matched = false;
// find a matching method by name
for (Method method: methods) {
   Class<?>[] parameterTypes = method.getParameterTypes();
   if ( "add".equals(method.getName()) && parameterTypes.length == 2 ) {
       // method is your target method 
       // however you'll need more strict checks if there can be another add method
       // in your class with 2 different parameter types
   }
}

正如其他答案所述,要使用getMethod(),您需要知道并使用您试图检索的方法的实际声明的形式参数。

但是,如果由于某种原因,您在编译时不知道形式参数,那么您可以迭代类中的所有方法,直到找到适合您的参数的方法(或找到适合您参数的最具体的方法)。

在apache-commons.bean-utils中已经有了这样的功能,特别是在org.apache.commons.bean utils.MethodUtils.invokeMethod(…)和MethodUtil.getMatchingAccessibleMethod(

上面方法的源代码可以在这里轻松地在线查看。

相关内容

  • 没有找到相关文章

最新更新