Como saber se a classe é do Java ou criada por mim?

Oi amigos!

Tenho uma rotina que pega um array de Field desse Field pego o getClass(), agora precisaria saber se essa classe é uma classe Java ou uma classe qualquer criada por mim, to tentando fazer a rotina bem genérica, alguma sugestão?

Obrigado!

Vou ver se acho uma solução mais interessante.

Que tal olhar pelo package da classe?

http://java.sun.com/javase/6/docs/api/java/lang/Class.html

Ou ainda, pelo Fully Qualified Name da classe.

Se for algo “java." ou "javax.” é uma classe da Java API, boa parte dá pra eliminar, mas não dá pra tomar isso como regra geral.

No link http://java.sun.com/javase/6/docs/api/ tem a lista de todos os packages.

Bom, taí a sugestão.

[]'s

Rode o programa a seguir. Ele pode imprimir algo como:

class TesteClassloader {
    public static void main(String[] args) {
        System.out.println (java.lang.System.class.getClassLoader()); // null
        System.out.println (org.xml.sax.DTDHandler.class.getClassLoader()); // null
        System.out.println (ClassLoader.getSystemClassLoader()); // sun.misc.Launcher$AppClassLoader@11b86e7
        System.out.println (TesteClassloader.class.getClassLoader()); // sun.misc.Launcher$AppClassLoader@11b86e7
    }
}

Programa com crise de identidade!!! :slight_smile:

Quem sou eu? http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getName()

De onde vim? http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getPackage()

Isso, é claro, supondo que você sabe pelo package o que é seu.

[quote=thingol]Rode o programa a seguir. Ele pode imprimir algo como:

class TesteClassloader { public static void main(String[] args) { System.out.println (java.lang.System.class.getClassLoader()); // null System.out.println (org.xml.sax.DTDHandler.class.getClassLoader()); // null System.out.println (ClassLoader.getSystemClassLoader()); // sun.misc.Launcher$AppClassLoader@11b86e7 System.out.println (TesteClassloader.class.getClassLoader()); // sun.misc.Launcher$AppClassLoader@11b86e7 } } [/quote]

Opa Thingol… Não entendi exatamente como essa solução funciona. Pode dar uma luz?

[]'s

obrigado pelas dicas mas o o nome da classe ou a package não me adiantariam porque queria deichar algo bem genérico que eu fizesse uma lib e jogasse num projeto e pudesse usar, se engessar uma package quando tenta usar num outro projeto vou ter que alterar a package ou então faezr uma package com aquele nome para ele achar as classes.

po thingol vlwww sempre salvando a galera
acho que da pra usar o que você postou ali em cima
=D

Na verdade não fica tão engessado assim: se você usar as convenções de nomeação, todos os pacotes começam pela identificação da empresa (nome do domínio na internet) e o projeto. O que vem depois disso você escolhe, da maneira que ficar mais organizado.
Então se você pegar apenas o começo do nome do pacote a sua lib pode ser usada em todos os projetos de uma determinada empresa que vai funcionar.

Você só vai precisar de algo mais genérico que isso se quiser usar em empresas diferentes, ou então se estiver desconfiado que alguém por aí não anda nomeando os pacotes corretamente :slight_smile:
Nesse caso vale a Super-solução do thingol.

Gostaria que alguém rodasse o programa em uma JVM da IBM ou da BEA. Na JVM da Sun, se uma classe já está no “boot classpath” (ou seja, aquelas classes que ficam em java., javax. ou então em jre/lib/ext, o seu classloader é null; mas não sei se em outras JVMs podemos supor isso. )

Perguntinha… suponhamos que você tenha posto o jar do driver do seu banco de dados em jre/lib/ext. Qual é o seu classloader?

Dizer que o classloader é null é uma solução que não resolve essa ambiguidade.

eu rodei thingol e usei aquele solução ali, se for uma classe do java ele retorna sempre null, do contrário me retorna uma String, e funcionou para solucionar o problema aqui.

sim gomesrod é que essa solução não é para a empresa na verdade oque fiz foi um Data Source Genérico para o iReport, vc passa uma List de um objeto para ele e ele busca os atributos das classes desse objeto asism como das classe pai e filhas e também das classe que ele se relaciona, e passa os campos que o iReport utiliza no relatório, dai não queria deixar engessado a nomenclatura de pacotes.