有没有办法检查给定的类类型是属于Java对象还是自定义对象

时间:2013-09-23 20:11:37

标签: java class reflection types

我正在寻找任何方法来检查类的给定属性的类型是自定义对象类型(例如,Person)还是Java对象(例如,String,Long,原始类型)类型。如果使用了instanceof,则会检查所有Java类型。任何人都可以建议一种方法来检查,如果存在的话。

6 个答案:

答案 0 :(得分:6)

Java非常“基于自身”。许多SDK可以被视为“自定义”或“内置”,具体取决于您查看它的方式。

例如,Exception内置于Java中,但也是用Java编写的。您可以自己编写类似的代码,但是根据您所说的我猜您会认为它是“Java对象”。

同样,ArrayList也是用Java编写的,但因为它是一个实用类,我猜你会认为它是“自定义的”,虽然我不确定,因为它仍然包含在SDK中

在不确切知道您要查找的内容的情况下,我根据您所说的内容(StringLong等)猜出的最接近的分组是java.lang包。在words of the SDK documentation本身,java.lang包:

  

提供对Java编程语言设计至关重要的类。

您可以检查对象的类的包名是否在java.lang

static class A {

}

public static void main (String[] args) {
    String test1 = "";
    A test2 = new A();
    int test3 = 3;

    System.out.println(isJavaLang(test1));
    System.out.println(isJavaLang(test2));
    System.out.println(isJavaLang(test3));
}

public static boolean isJavaLang(Object check) {
    return check.getClass().getName().startsWith("java.lang");
}

Working example

答案 1 :(得分:3)

尝试使用该对象来自的包的实现 vendor 标题。似乎标准Java包将此值设置为 "Oracle Corporation" "Java Runtime Environment"

public static boolean isJavaLang(Object check) {
    if (check == null)// lets say that null comes from JRE
        return true;

    return isJavaLang(check.getClass());
}

public static boolean isJavaLang(Class<?> check) {

    Package p = check.getClass().getPackage();

    if (p == null) // default package is package for users classes
        return false;

    String title = p.getImplementationTitle();
    if (title == null)// no title -> class not from Oracle
        return false;

    // System.out.println(p.getImplementationVendor());
    // System.out.println(p.getImplementationTitle());
    return title.equals("Java Runtime Environment");
}

答案 2 :(得分:2)

我不完全确定我的问题是对的......

java.lang.Class类提供了一些可以使用的工具。

isPrimitive()功能

  

确定指定的Class对象是否表示基本类型。   有九个预定义的Class对象来表示八种基本类型和void。它们由Java虚拟机创建,并且与它们表示的基本类型具有相同的名称,即boolean,byte,char,short,int,long,float和double。

     

这些对象只能通过以下公共静态最终变量访问,并且是此方法返回true的唯一Class对象。

至于其他类,没有“Java对象”这样的东西 - 每个对象都是一个Java对象......但是你可以检查一下这个类的名字是否以{{1}开头}前缀,但java.lang package包含很多不同的东西,不仅仅是你想要找到的基本数据类型。

答案 3 :(得分:2)

没有故障安全的方法来做到这一点。正如其他人所说,Java在常规课程上建立了很多。

我想,从原始人开始,这一切都归结为你自己对“JDK的课程”与“我的课程”与“第三方课程”的定义。

@splungebob的解决方案适用于您自己的单个树分支类。

我认为以下软件包中的类可以安全地(如果最小化的话)被视为JDK:

java.lang.*
java.*
javax.*
com.sun.*
com.oracle.*

您可能还会添加一些常见的第三方,例如org.apache。*

答案 4 :(得分:1)

我想你想要这样的东西:

public static boolean isJavaObject(Object obj)
{
  return (! obj.getClass().getName().startsWith("my.package"));
}

其中"my.package"是你的包层头的头部。

答案 5 :(得分:0)

假设您自己的类不在名称以java*开头的包中:

public static <T> boolean isJDKClass(T t) {
     return t.getClass().getPackage().getName().startsWith("java");
}