【问题标题】:Java reflection, what class does the object have?Java反射,对象有什么类?
【发布时间】:2012-01-08 09:32:43
【问题描述】:

我正在尝试对小程序进行一些反思。 我发现的东西是一些整数、字符串、对象等数组。

例如,如果有一个包含 object[] 和 object[0].toString() = [I@7593c366 然后我知道它是一个整数数组。但是如果它说 aa@98324ca33 是它的类然后是 aa 怎么办? 我正在使用类加载器,所以我的第一个猜测是,当我看到这个时,我需要加载 aa 类(@ 之前的部分,并使用其中的对象。但我不确定 @ 之前的部分是类。有人可以说我吗这是对的吗?还是有其他想法?

谢谢!

【问题讨论】:

  • 你为什么不直接使用object[0].getClass()?另外,为什么需要再次加载该类?而且你知道一个类通常不包含对象,不是吗?因此使用其中的对象并不十分准确。

标签: java reflection


【解决方案1】:

您不应该为此使用toString() - 一方面,它可能已被覆盖。举个简单的例子:

Object x = "aa@98324ca33";
String bogusClassName = x.toString();

如果您认为x 在这里指的是aa 类型的对象,显然是错误的——它指的是一个字符串。

你可以通过调用getClass()找到任何对象的类:

Object x = new SomeType();
Class<?> clazz = x.getClass();

首先不清楚您要做什么或从哪里获取信息,但您绝对不应该使用toString 来确定所涉及的类.

【讨论】:

    【解决方案2】:

    是的,@ 之前的部分是类 fqn,但你不应该依赖它。对象可以覆盖toString(),然后你的逻辑就会失败。

    请改用obj.getClass()

    【讨论】:

      【解决方案3】:

      看看java.lang.Class的课程。只需在对象上调用 getClass 即可检索其类,而不是使用 toString 方法

      Object anObject = ... ;
      Class<?> clazz = anObject.getClass();
      

      如果要检查是否是数组,可以使用Class#isArray()方法

      clazz.isArray()
      

      反之亦然。如果你有Class实例,你可以通过Class#isInstance( Object )方法判断一个对象是否属于这个类

      clazz.isInstance( anObject );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-16
        • 2016-03-03
        • 1970-01-01
        • 2012-04-06
        • 2016-03-30
        • 1970-01-01
        • 2017-08-08
        • 2010-11-26
        相关资源
        最近更新 更多