如何在java中只获取特定的返回类型和方法名称,而不获取完全限定的返回类型和方法名称

如何在java中只获取特定的返回类型和方法名称,而不获取完全限定的返回类型和方法名称,java,reflection,Java,Reflection,通过以下方式 Class c = Class.forName("java.lang.Double"); Method[] m = c.getDeclaredMethods(); for(Method m1 : m) System.out.println(m1); 输出为: public boolean java.lang.Double.equals(java.lang.Object) public static java.lang.String java.lang.Doub

通过以下方式

Class c = Class.forName("java.lang.Double");
Method[] m = c.getDeclaredMethods();
for(Method m1 : m)
System.out.println(m1);
输出为:

public boolean java.lang.Double.equals(java.lang.Object)
public static java.lang.String java.lang.Double.toString(double)
public java.lang.String java.lang.Double.toString()
public int java.lang.Double.hashCode()
-----------------------------------------
-----------------------------------------
-----------------------------------------
-----------------------------------------
其中,我需要进行更改以获得返回类型和方法名称,而不使用包名称,以获得所需的输出,如下所示:

public boolean equals(Object)
public static String toString(double)
public String toString()
public int hashCode()
--------------------------------------------
--------------------------------------------
--------------------------------------------
通过将整个方法分成几个部分,分别取修饰符、返回类型、方法名和参数名,得到了解决方案

Method[] m = c.getDeclaredMethods();
    Parameter[] param;
    int paramLen;
    for(Method m1 : m){
      System.out.print(Modifier.toString(m1.getModifiers()) + " ");
      System.out.print(m1.getReturnType().getSimpleName());
      System.out.print(" ");
      System.out.print(m1.getName() + "(");
      param = m1.getParameters();
      paramLen = param.length;
      for(Parameter param1 : param){
        System.out.print(param1.getType().getSimpleName() + " " + param1.getName());
        if(--paramLen > 0)
        System.out.print(", ");
      }
    System.out.println(")");

对于使用简单名称的方法,没有内置的
toString
方法。我能找到的最接近的是:

返回方法类型的字符串表示形式,格式为
“(PT0,PT1…)RT”
。方法类型的字符串表示是一个用括号括起来的逗号分隔的类型名列表,后跟返回类型

每种类型都由其属性表示

因此,这仍然需要进行调整以用于方法描述

注意:您应该按照中的建议使用
Modifier.toString(m1.getModifiers()&Modifier.methodModifiers())
来过滤不适当的位

此外,尽可能限制变量的范围,即不要将变量
param
paramLen
声明在循环之外,而是在其首次使用的地方。但您也可以使用以下方法简化代码:

for(方法m:c.getDeclaredMethods()){
细木工j=新细木工(“”);
字符串访问=Modifier.toString(m.getModifiers()&Modifier.methodModifiers());
如果(!access.isEmpty())j.add(access);
j、 添加(m.getReturnType().getSimpleName());
细木工argJ=新细木工(“,”);
对于(Class cl:m.getParameterTypes())argJ.add(cl.getSimpleName());
System.out.println(j.add(m.getName()+“(“+argJ+”)));
}
我们可以实现同样的效果,但要利用开头提到的
MethodType
toString()
方法:

for(方法m:c.getDeclaredMethods()){
细木工j=新细木工(“”);
字符串访问=Modifier.toString(m.getModifiers()&Modifier.methodModifiers());
如果(!access.isEmpty())j.add(access);
String shortSig=MethodType.MethodType(m.getReturnType(),m.getParameterTypes())
.toString();
int split=shortSig.lastIndexOf('))+1;
j、 add(shortSig.substring(split)).add(m.getName()+shortSig.substring(0,split));
系统输出println(j);
}
这两个变体都只打印类型名称,就像
方法的
toString()
方法一样。如果您想打印参数名称,就像您的变量一样,可以调整此答案的第一个变量:

for(方法m:c.getDeclaredMethods()){
细木工j=新细木工(“”);
字符串访问=Modifier.toString(m.getModifiers()&Modifier.methodModifiers());
如果(!access.isEmpty())j.add(access);
j、 添加(m.getReturnType().getSimpleName());
细木工argJ=新细木工(“,”);
对于(参数p:m.getParameters())
argJ.add(p.getType().getSimpleName()+“”+p.getName());
System.out.println(j.add(m.getName()+“(“+argJ+”)));
}