public static void main (String [] args){try
{
String name=new String("ss").getClass().getName();
 Class<?> className=Class.forName(name); 
  Method method=method=className.getMethod("valueOf",  className);
System.out.print(method);
}
catch(Exception e)
{
e.printStackTrace();
}
}这样的话总是打印出java.lang.NoSuchMethodException: 有人知道该怎么才能获取method吗?

解决方案 »

  1.   

    加参数(方法的参数类型)啊,很多类都有重载的方法,你不加参数JVM不知道你要的是哪个方法
      

  2.   

    是这样吗?
     Method method=method=className.getMethod("valueOf(Object obj)",  className);还是不行的哦
      

  3.   

    public Method getMethod(String name,
    Class... parameterTypes)
    throws NoSuchMethodException,
    SecurityException返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法public class Main {
    public static void main(String[] args) {
    try {
    String name = new String("ss").getClass().getName();
    Class[] param = {  Object.class };
    Method method = method = Class.forName(name).getMethod("valueOf", param);

    System.out.print(method);

    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  4.   

    我明白了,是不是getMethod("valueOf", param);
    当中的第二个参数是第一个参数(方法)接受的参数
      

  5.   

    但是有一个问题
    getMethod("valueOf", param); 在应用中,我的方法名也是不固定的啊,那后面的参数该怎么弄呢?
      

  6.   


    难道你的方法名会“变" ? 一会是 GetA 一会是 GetB 么?
      

  7.   

    对啊 ,因为我用的是Spring 的AOP来实现日志,
    而日志的话是拦截方法上的注释来生成的,所以说方法肯定都不一样的啊我用到时的代码是这样的,
            String temp=joinPoint.getStaticPart().toShortString(); 
            String classType=joinPoint.getTarget().getClass().getName(); 
           
            String methodName=temp.substring(temp.indexOf(".")+1 , temp.length()-1); 
            
            int endIndex=methodName.lastIndexOf("(");
            String methodStringName=methodName.substring(0, endIndex);        
           Class<?> className=Class.forName(classType); 
            Method method=className.getMethod(methodStringName, new Class[]{}); 
      

  8.   


    Annotation 可以取方法名和参数等信息
      

  9.   

    getMethods()
    getDeclaredMethods()
    都可以获取一个类你的方法,循环一下找到你要的方法或者楼上所说用Annotation标记一下getDeclaredMethods().getAnnotation(param)来获取
    不过有点麻烦
      

  10.   

    public class Main {
    public static void main(String[] args) {
    try {
    String name = new String("ss").getClass().getName();
    Class[] param = { Object.class };
    Method method = Class.forName(name).getMethod("valueOf", param); System.out.print(method); } catch (Exception e) {
    e.printStackTrace();
    } Class c = null;
    try {
    c = Class.forName("java.lang.String");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } Method[] methods = c.getDeclaredMethods();
    for (int i = 0; i < methods.length; i++) {
    if (methods[i].getName().equals("valueOf")) {
    System.out.println("valueOf");
    }
    }
    }
    }
      

  11.   

    去查API。
    要找方法,肯定要知道方法名,方法参数的个数,以及每个参数的类型的。
    在jdk5.0里,是这样:
    public Method getMethod(String name,Class... parameterTypes)
    按顺序把每个参数的类型列出来。
      

  12.   

    String类没有valueOf(String)这个方法
      

  13.   


    你的methodStringName没有trim(),可能带了空格
    另外,如果是取没有参数的method,可以用getMethod(methodName, null),可以少创建一个数组对象
      

  14.   

    楼上说的对。在API中已经说得很清楚了。public Method getMethod(String name,
                            Class<?>... parameterTypes)
                     throws NoSuchMethodException,
                            SecurityException返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。 
    如果 name 是 "<init>;" 或 "<clinit>",则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类): 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。 
    如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。 
    在 C 类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形参类型,则它就是反映的方法。如果在 C 中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。 
    注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。 请参阅Java 语言规范 第 8.2 和 8.4 节。 
    参数:
    name - 方法名
    parameterTypes - 参数列表 
      

  15.   

    在aop中
     Object[] args=joinPoint.getArgs();
    传入的joinPoint   能够得到所有的参数的数组对象通过    String methodName=joinPoint.getSignature().getName(); 
    能够得到methodName 
    接下来 Method method=className.getMethod(methodName, new Class[]{}); 
    当中的第二个参数是需要的是Class形式的数组,
    怎么把Object[]转换成Class[] 呢?
      

  16.   

    List<Class> a = new ArrayList<Class>();
    Object[] o = null;// joinPoint.getArgs();
    for (Object object : o) {
    a.add(object.getClass());
    }
    Class[] c = (Class[]) a.toArray();
      

  17.   

    楼上的java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class; 强制转换出了问题
      

  18.   

    getMethod(methodName, new Class[]{})这样写是获取参数为空的方法
    好像没什么好办法,for循环赋值不过,你可以这样
    Method m = Class.class.getMethod("getMethod", new Class[]{String.class, new Class[]{}.getClass()});
    Object[] ta = new Object[args.length+1];
    ta[0] = methodName;
    System.arrayCopy(args, 0, ta, 1, args.length);
    Method method = (Method)m.invoke(className, ta);上面只是一种解决方案,不是提倡这样做,呵呵
      

  19.   

    是System.arraycopy,大小写错了 Class[] cs = new Class[args.length];
    for (int i=0;i<args.length;i++) {
    cs[i] = args[i].getClass();
    }
      

  20.   


    Object[] a = joinPoint.getArgs();;
    Class[] o = new Class[] {};// 
    for (int i = 0; i < a.length; i++) {
    o[i] = a[i].getClass();
    }