6

I was searching for any ways to check whether the type of the given attribute of a class is of custom object type (for eg., Person) or Java object (for eg., String, Long, primitive types as well) type. If instanceof is used, it will be hectic checking all of the Java types. Can anyone suggest a way to check, if anything as such exists.

4

6 回答 6

9

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

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

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

在不确切知道您在寻找什么的情况下,我可以根据您所说的( , 等)猜测最接近的分组StringLongjava.lang用 SDK 文档本身的话来说,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");
}

工作示例

于 2013-09-23T20:19:18.313 回答
3

尝试使用该对象来自的包的实现供应商标题。似乎标准 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");
}
于 2013-09-23T20:57:13.887 回答
2

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

java.lang.Class类具有一些您可以使用的工具。

isPrimitive ()函数

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

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

至于其他类,没有“Java 对象”之类的东西——每个对象都是一个 Java 对象……但是您可以例如检查相关类的名称是否以java.lang.前缀开头,但java.lang包也包含很多不同的东西,不仅仅是你想找到的基本数据类型。

于 2013-09-23T20:16:17.157 回答
2

没有故障安全方法可以做到这一点。正如其他人所说,Java 在常规类上构建了很多东西。

我想,除了原语之外,这一切都归结为您自己对“JDK 的类”、“我的类”和“第 3 方类”的定义。

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

我认为以下包中的类可以安全地被视为 JDK:

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

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

于 2013-09-23T20:39:56.367 回答
1

我想你想要这样的东西:

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

"my.package"你的包层次结构的头在哪里。

于 2013-09-23T20:34:45.320 回答
0

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

public static <T> boolean isJDKClass(T t) {
     return t.getClass().getPackage().getName().startsWith("java");
}
于 2013-09-23T20:23:15.333 回答