1

假设我有以下三个类

爪哇

public class A {
    public static void main (String[] args) {
        new C();
    }
}

B.java

import java.lang.reflect.Method;
import java.util.Arrays;

public class B {
    public B() {
        Method[] m = this.getClass().getDeclaredMethods();
        System.out.println(Arrays.toString(m));
    }

    public void hello() {

    }
}

C.java

public class C extends B{
    public C() {
        super();
    }
}

我在 A 类中运行 main 方法。好吧,它应该实例化 C 类,而 C 类又应该调用 B 类的构造函数,以打印出声明的方法。输出是[]。这让我感到惊讶,因为我期望输出是(假设所有类都在 package called 中test):

[public void test.B.hello()]

那么,怎么了?我如何得到它,以便这是实际的输出?

4

3 回答 3

4

getClass返回实例的类。在这种情况下,这是C。类中没有声明的方法CClass您还可以使用返回对象的“getSuperClass”方法来解决您的问题:

Class c = this.getClass();
while (c != null) {
  System.out.println(Arrays.toString(c.getDeclaredMethods()));
  c = c.getSuperClass();
}
于 2013-02-12T21:15:57.680 回答
1

这里的关键是使用单词thisThat 暗示当前上下文,它 ifC是 is 的具体子BC。要获取B's方法,您需要遍历直到到达 B。这可能取决于应用程序逻辑。一种方法如下。

import java.lang.reflect.Method;
import java.util.Arrays;

public class B {
    public B() {
        Class<?> parent = getClass();
        while(parent.getSuperclass() != null) {
            if(parent.getSuperclass() != Object.class) {
                parent = parent.getSuperclass();
            } else {
                break;
            }
        }
        Method[] m = parent.getDeclaredMethods();
        System.out.println(Arrays.toString(m));
    }

    public void hello() {

    }
}
于 2013-02-12T21:27:43.930 回答
0

//其实可以得到不同包下不同类中方法的个数......
//去看看结果......

import java.lang.reflect.Method;


    public class TestPackage {
        public static void main(String args[]) throws ClassNotFoundException
        {
            int count=0;
            Class c=Class.forName("java.util.Scanner");
            Method[] m=c.getDeclaredMethods();
            for(Method m1:m)
            {
                count++;
                System.out.println(m1.getName());
            }
            System.out.println("The no. of methods are:"+count);

        }

    }
于 2018-02-04T18:55:27.713 回答