我正在寻找任何方法来检查类的给定属性的类型是自定义对象类型(例如,Person)还是Java对象(例如,String,Long,原始类型)类型。如果使用了instanceof,则会检查所有Java类型。任何人都可以建议一种方法来检查,如果存在的话。
答案 0 :(得分:6)
Java非常“基于自身”。许多SDK可以被视为“自定义”或“内置”,具体取决于您查看它的方式。
例如,Exception
内置于Java中,但也是用Java编写的。您可以自己编写类似的代码,但是根据您所说的我猜您会认为它是“Java对象”。
同样,ArrayList
也是用Java编写的,但因为它是一个实用类,我猜你会认为它是“自定义的”,虽然我不确定,因为它仍然包含在SDK中
在不确切知道您要查找的内容的情况下,我根据您所说的内容(String
,Long
等)猜出的最接近的分组是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");
}
答案 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类提供了一些可以使用的工具。
确定指定的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");
}