【问题标题】:getClass() returning java.lang.Class [Reflection]getClass() 返回 java.lang.Class [反射]
【发布时间】:2014-09-16 15:23:26
【问题描述】:

所以在通过反射获取方法的参数时:

Class<?>[] params = m.getParameterTypes();

假设我正在循环遍历方法并寻找只有一个参数的方法:

if(params.length > 1) {
     continue;
}

如果 params 数组的长度为 1,则获取该参数:

Class<?> par = params[0];

当我尝试使用 getClass() 方法打印出参数的类时,它返回 java.lang.Class。

但是,当我使用 getSuperclass() 方法获取超类时,它会返回超类。

例如:

System.out.println(par.getClass());
System.out.println(par.getSuperclass());

假设我们的方法的参数是一个名为“PlayerDeathEvent”的类,它扩展了抽象的“Event”类。

话虽如此,输出将是:

java.lang.Class
org.mypackage.Event

出现这种情况有什么原因吗?我用 getCanonicalName 找到了解决这个问题的方法,但我很好奇为什么会发生这种情况。

【问题讨论】:

  • 停止呼叫getClass()getSuperclass()par 已经是一个 java.lang.Class 对象。只需System.out.println(par);
  • 明确地说“停止调用”这些方法是一个糟糕的评论。
  • 我很抱歉。如果可以的话,我会编辑它。

标签: java reflection


【解决方案1】:

返回实例的Class 对象的getClass() method is a method in Object。你有一个Class 对象,所以getClass() 返回Class 类的Class 对象——与Class 的实例不同的Class

但是,getSuperclass() method, defined in Class 返回类的超类的Class 对象,而不是getClass() 返回的Class

要获取PlayerDeathEvent,请致电getName()

System.out.println(par.getName());

【讨论】:

  • @T.J.Crowder 你是对的; getName() 更好。我已经更新了我的答案。
【解决方案2】:

parClass 的对象:

Class<?> par = params[0];

getClass 来自java.lang.Object。它返回对象的类(类型)。

所以如果sString

String s = "test";

s.getClass 返回String"。 同样的逻辑,par.getClass() 返回Class

另一方面,getSuperClass 定义为 java.lang.Class,它返回所表示的类的超类。

所以如果sString,而c 是一个持有反射Class 的类:

String s = "test";
Class c = s.getClass();

s.getClass 返回String
c.getSuperClass 返回Object 因为ObjectStrings 超类
c.getName 返回String 并且
c.getClass 返回@ 987654351@


您可能正在寻找 getName()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2014-12-07
    • 1970-01-01
    • 2014-12-24
    • 2016-02-10
    相关资源
    最近更新 更多