En Java, existe-t-il un moyen de savoir si une classe est une simple classe 'Java'?


J'utilise la réflexion pour lire certains objets de classe que j'ai créés et j'utilise la récursivité pour tracer à travers toute l'arborescence des objets.

Le problème que j'ai est que lorsque j'ai un "Champ" j'ai besoin de savoir si c'est un simple attribut ou un autre objet complexe. Le premier peut juste être traité immédiatement, mais le dernier je dois creuser et appeler à nouveau la méthode récursive. Mon code est quelque chose comme ceci :

recurse(Object o) {
    Class clazz = o.getClass();
    for (Field f : clazz.getDeclaredFields() ) {
        fieldClass = f.getType();

        // Heres the broken part
        if ( !ClassUtils.isPrimitiveOrWrapper(fieldClass) ) {
            recurse(f.get(o));
        }
        else {
            // Process simple attribute
        }
    }
}

Je pensais que cela fonctionnerait, mais alors je trouvé que String n'est pas un 'PrimitiveOrWrapper'.... ensuite, j'ai trouvé que cette date n'est pas non plus... ensuite, j'ai trouvé que BigDecimal n'est pas non plus...

N'y a-t-il vraiment AUCUNE classe ou package utilitaire capable de gérer cette demande? Tout ce que je veux, c'est savoir si une classe est une classe Java interne / native / simple / simple / basique ou un objet complexe que j'ai écrit. Cela ne devrait pas être dur.

Je crois que mes choix sont:

  1. Essais et erreurs pour les énumérer tous individuellement-en espérant que deux an à l'avenir je n'ajoute pas d'autre attribut d'un type que je n'ai pas utilisé avant (Beurk!)
  2. Voir si le nom de classe commence par la chaîne java. (double Beurk!)

Veuillez me dire que j'ai manqué une belle classe/méthode utilitaire quelque part.

Author: AutomatedOrder, 2015-10-15

1 answers

Il n'y a pas d'appel API unique qui vous dira si l'objet est interne ou non.

Vous pouvez cependant utiliser les méthodes suivantes:

isPrimitive
isArray
getPackage

, Le premier est assez simple. Le second, isArray est nécessaire car il existe une méthode spéciale qui renverra le type de composant du tableau. Enfin getPackage peut être utilisé pour répondre à la question, cet objet fait-il partie de la famille JDK ou non. Tous les paquets d'API Java publics commencent par java. ou javax. et les API Java privées commencent avec sun..

 1
Author: Chris K, 2015-10-15 21:04:54