【问题标题】:Check if class member is a class object检查类成员是否是类对象
【发布时间】:2011-07-20 07:50:30
【问题描述】:

我有一个类,其成员是其他成员中的另一个类对象。我想知道如何确定这个字段是否是一个java类(用户定义的)。 也就是说,我有这样的事情: 用户传递 java 类的名称。如果包中包含该名称的类,那么我将获取该类的所有声明字段,并对作为类对象的那些数据成员执行 DFS 类型的操作。

class A {
  private String c;
  private B b;
}

class B {
  private int d;
  private String f;
}

所以现在在 A 中,我只需要选择 B 并访问 B 的成员。 如何做到这一点?

谢谢。

【问题讨论】:

  • 是否有区分您感兴趣的课程和您想忽略的课程的标准?比如包名?
  • 我不知道你到底想做什么,但听起来有些……可疑。也许你应该解释一下大局目标,你可能会发现比处理包等更好的解决方案......
  • 好的。所以我发现这样做很有效。 if(allDeclaredFields[i].getType().getPackage() == null && !allDeclaredFields[i].getType().isPrimitive()) { 类 thisClass = allDeclaredFields[i].getClass(); }
  • 我发现在 A 中选择 B 因为 String 的包是 java.lang 并且对于原始类型(我不想选择)我做 !isPrimitive()
  • 字符串呢?它们不是原语,但您也想跳过它们,不是吗,以及所有标准 Java 库类型?

标签: java reflection


【解决方案1】:

还有一个技巧。但结果严格取决于类加载器。它可以帮助您检查一个类是否是自定义用户类。尝试运行此代码以确定 jar 的位置:

    ProtectionDomain domain = allDeclaredFields[i].getClass().getProtectionDomain();
    System.out.println("domain: " + domain);
    CodeSource codeSource = domain.getCodeSource();
    if(codeSource != null) {
       System.out.println("location: " + codeSource.getLocation());
    } else {
        System.out.println("null location, probably JRE class");
    }

【讨论】:

  • 嗨,感谢您让我知道这一点。但似乎不起作用:(它也表示类对象的 JRE 类。
  • 对于 java.lang.String 或 ArrayList 等类对象,它会这样说。
【解决方案2】:

您需要使用 Java 反射。更多信息见http://download.oracle.com/javase/tutorial/reflect/index.html(点击会员,应该是你需要的)

【讨论】:

  • 我只使用反射。但我发现至少没有办法直接做到这一点。
  • 顺便说一句,如果您只想加载用户定义类的成员,也许您应该只使用自定义类加载器。如果有异常,则该类不存在。否则,也许只是向他们展示成员?
  • 对不起。我以前没有使用过类加载器。所以没有回复。让我调查一下。谢谢。
【解决方案3】:

如果我得到了正确的问题,你正在尝试查找一个对象是否属于一个类。有一个名为 instanceof 的 java 运算符来检查它

if(b instanceof B){
//b is an object of B
}

【讨论】:

  • 看来这不是 OP 的问题。他想知道如何判断某物是否是用户定义的类(而不是原始类)
  • 是的。我事先不知道 b 将是 B 的一个实例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2018-09-10
  • 2011-09-26
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多