6

クラスの特定の属性の型がカスタム オブジェクト型 (Person など) であるか、Java オブジェクト (String、Long、プリミティブ型など) 型であるかを確認する方法を探していました。instanceof を使用すると、すべての Java タイプをチェックするのに多忙になります。そのようなものが存在するかどうかを確認する方法を誰でも提案できますか。

4

6 に答える 6

9

Java は非常に「それ自体の上に構築」されています。SDK の多くは、見方によって「カスタム」または「ビルトイン」の両方と見なすことができます。

たとえば、ExceptionJava に組み込まれていますが、Java で書かれています。同様のコードを自分で書くこともできますが、あなたが言ったことに基づいて、それを「Javaオブジェクト」と見なすと思います。

も同様ArrayListに Java で記述されていますが、ユーティリティ クラスであるため、「カスタム」と見なされると思いますが、SDK にまだ含まれているため、わかりません。

あなたが探しているものを正確に知らなくても、あなたが言ったことに基づいて推測できる最も近いグループ ( StringLongなど) はjava.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 に答える
2

私はあなたの質問が正しいかどうか完全にはわかりません...

java.lang.Classクラスには、使用できるいくつかのツールがあります。

isPrimitive ()関数

指定された Class オブジェクトがプリミティブ型を表しているかどうかを判断します。8 つのプリミティブ型と void を表す 9 つの定義済み Class オブジェクトがあります。これらは Java 仮想マシンによって作成され、boolean、byte、char、short、int、long、float、および double など、それらが表すプリミティブ型と同じ名前を持ちます。

これらのオブジェクトは、次の public static final 変数を介してのみアクセスでき、このメソッドが true を返す唯一の Class オブジェクトです。

java.lang.他のクラスに関しては、「Java オブジェクト」のようなものはありません。すべてのオブジェクトは Java オブジェクトです...しかし、たとえば、問題のクラスの名前がプレフィックスで始まるかどうかを確認できますが、 java.langパッケージには、見つけたい基本的なデータ型だけでなく、さまざまなものも含まれています。

于 2013-09-23T20:16:17.157 に答える
2

これを行うためのフェイルセーフな方法はありません。他の人が言ったように、Java は通常のクラスで多くのことを構築します。

プリミティブを除いて、すべて「JDKのクラス」対「私のクラス」対「サードパーティのクラス」の独自の定義に要約されると思います。

@splungebob のソリューションは、独自の単一ツリー ブランチ クラスで機能します。

次のパッケージのクラスは、最小限の要件であれば安全に JDK と見なすことができると思います。

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

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 に答える