Java反射输出

时间:2016-05-01 22:44:43

标签: java reflection

我获得了以下任务:

  

编写一个方法displayMethodInfo(作为你的一个类的方法)   选择),具有以下签名:静态无效   displayMethodInfo(Object obj);该方法写入标准   输出,obj方法的类型。请格式化方法类型   根据以下示例。让obj成为一个实例   下课:

class A {
    void foo(T1, T2) { ... }
    int bar(T1, T2, T3) { ... }
    static double doo() { ... }
}
     

displayMethodInfo(obj)的输出应如下所示:

foo (A, T1, T2) -> void
bar (A, T1, T2, T3) -> int
doo () -> double
     

如您所见,接收器类型应该是第一个参数类型。   声明为static的方法没有接收器,因此不应该   将类类型显示为第一个参数类型。

此作业的工作代码是:

import java.lang.Class;
import java.lang.reflect.*;

class Main3 {

    public static class A  {
        void foo(int T1, double T2) { }
        int bar(int T1, double T2, char T3) { return 1; }
        static double doo() { return 1; }
    }

    static void displayMethodInfo(Object obj)
    {
        Method methodsList[] = obj.getClass().getDeclaredMethods();
        for (Method y : methodsList)
        {
            System.out.print(y.getName() + "(" + y.getDeclaringClass().getSimpleName());
            Type[] typesList = y.getGenericParameterTypes();
            for (Type z : typesList)
                System.out.print(", " + z.toString());
            System.out.println(") -> " + y.getGenericReturnType().toString());
        }
    }

    public static void main(String args[])
    {
        A a = new A();
        displayMethodInfo(a);
    }
}

这有效,但我的输出如下:

foo(A, int, double) -> void
bar(A, int, double, char) -> int
doo(A) -> double

如何更改此设置以使输出看起来像所要求的那样?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你唯一的问题是将类类型作为静态doo()方法中的第一个参数。

您可以使用Modifier.isStatic()方法检查:

     boolean isStatic = Modifier.isStatic(y.getModifiers());
     System.out.print(y.getName() + "("
                         + (isStatic ? "" : y.getDeclaringClass().getSimpleName()));

然后你必须摆脱额外的逗号,但这不应该是难的;)