假设我有以下三个类
A.java
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类的构造函数来打印出声明的方法。输出为[]
。这对我来说是一个惊喜,因为我期待输出(假设所有类都在名为test
的包中):
[public void test.B.hello()]
那么,怎么了?我如何得到它以便这是实际输出?
答案 0 :(得分:4)
getClass
返回实例的类。在这种情况下,这是C
。类C
中没有声明的方法。您也可以使用返回的Class
对象的'getSuperClass'方法来解决您的问题:
Class c = this.getClass();
while (c != null) {
System.out.println(Arrays.toString(c.getDeclaredMethods()));
c = c.getSuperClass();
}
答案 1 :(得分:1)
这里的关键是使用单词this
这意味着当前的上下文,如果C
是B
的具体子类是C
。要获得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() {
}
}
答案 2 :(得分: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);
}
}