Percorrer classe de um arquivo .jar [Invenções do JAVA que não funcionam]

5 respostas
Matheus_Leandro_Ferr

Boa tarde,

Tenho o meu arquivo .jar. Dentro deste arquivo existem varias pastas e varias classes com extensão .class
Dentro de uma .class existe uma variavel que quero acessa-la.

Fiz um programa para isso.. segue:

JarFile
lo_jar_read		=	null;
	
try
{
	//
	// Recebe a instancia Carro.jar lido do disco.
	//
	lo_jar_read		=	new JarFile("Carro.jar");
			
	//
	// Recebe um enumeration contendo os diretórios presentes do jar.
	//
	Enumeration<JarEntry> 
	lo_enum			=	lo_jar_read.entries();     
		         
	//
	// Percorre os diretórios lidos no jar.
	//
	while	(
			lo_enum.hasMoreElements()
		) 
	{     
		//
		// Recebe o próximo diretório do jar.
		//
                JarEntry 
                jarEntry		=	(JarEntry) lo_enum.nextElement();
                
                //
                // Recebe o nome do diretório atual lido no jar.
                //
                String 
                arquivo			=	jarEntry.getName();
		                
                System.out.println(arquivo);
		                
                //
                // Verifica se o diretório "carro/modelo/Modelo.class" está lá dentro ...
                //
                if	(
                		arquivo.equals("carro/modelo/Modelo.class")
                	) 
                {
                	//
                	// Recebe a classe no qual irá ser utilizada.
                	//
                	Class
                	lo_class		=	arquivo.getClass(); //PROBLEMA! eu gostaria de pegar o Modelo.class
		                	
                	try
			{
                		//
                		// Recebe a instancia da classe que será utilizada.
                		//
				Object
				lo_object_class		=	lo_class.newInstance();
						
				//
				// Se for Modelo.class
				//
				if	(
						lo_object_class		instanceof	Modelo
					)
				{
					//
					// Recebe a classe Modelo.
					//
					Modelo
					lo_modelo		=	(Modelo)lo_object_class;
							
					//
					// Mostra a versão da classe.
					//
					System.out.println(lo_modelo.VERSION);
				}
			}
			catch (InstantiationException e)
			{
				e.printStackTrace();
			}
			catch (IllegalAccessException e)
			{
				e.printStackTrace();
			}
                	
                	break;     
                }
	}
}
catch (IOException e)
{
	e.printStackTrace();
}
		
//
// Sempre executa para fechar a leitura do arquivo jar.
//
finally
{
	//
	// Se existe um arquivo jar aberto ...
	//
	if	(
			lo_jar_read		!=	null 
		)
	{   
		try 
		{
			//
			// Fecha o arquivo JAR
			//					
			lo_jar_read.close();   
                }
		catch (IOException e) 
		{   
			e.printStackTrace();
                }   
	}
}

Notem que na codificação abaixo, estou pegando a referencia (class) da minha variavel arquivo.

//
// Recebe a classe no qual irá ser utilizada.
//
Class
lo_class		=	arquivo.getClass();

Então, é ai que está o grande problema. O getClass desta classe arquivo é String e não o Modelo.class que eu gostaria de pegar.

Muito dificil de explicar né?! Eu quero acessar uma variavel dentro da classe Modelo.class lida do meu arquivo .jar

Alguem pode me ajudar ?

5 Respostas

Matheus_Leandro_Ferr

Como extrair uma class de um .jar ?

Matheus_Leandro_Ferr

Alguem pode responder alguma pergunta minha?
uma vez na vida?

T

Você pode carregar essa classe usando um URLClassLoader. Uma vez você achando essa classe no seu jar, você pode carregá-la (e nem precisa fazer tudo isso que você fez manualmente). Carregando a tal classe, você pode pegar o tal valor da variável.

Veja como puxar uma classe neste exemplo:

http://blogs.sun.com/CoreJavaTechTips/entry/closing_a_urlclassloader

(Atenção - o método “close” para URLClassloader só estará disponível a partir do Java 7. )

Matheus_Leandro_Ferr

Thingol,

Muito bom esse exemplo.. "ficou melzinho na chupeta"

Segue a correção:

//
// "Busca" o arquivo jar.
//
URL
url			=	new URL("file:Carro.jar");

//
// Carrega o arquivo.
//			
URLClassLoader
loader			=	new URLClassLoader(new URL[]{url});

//
// Carrega a classe Modelo.
//                	
Class
lo_class		=	Class.forName("carro.modelo.Modelo", true, loader);
        		
//
// Recebe a instancia da classe que será utilizada.
//
Object
lo_object_class		=	lo_class.newInstance();
			
//
// Se for Modelo.class
//
if	(
		lo_object_class		instanceof	Modelo
	)
{
	//
	// Recebe a classe Modelo.
	//
	Modelo
	lo_modelo		=	(Modelo)lo_object_class;
				
	//
	// Mostra a versão da classe.
	//
	System.out.println(lo_modelo.VERSAO);
}
Matheus_Leandro_Ferr

Achei que tinha funcionado.. mas está naba não funcionou!

Quando executo o comando:

//   
// Carrega a classe Modelo.   
//                     
Class   
lo_class        =   Class.forName("carro.modelo.Modelo", true, loader);   
                   
//   
// Recebe a instancia da classe que será utilizada.   
//   
Object   
lo_object_class     =   lo_class.newInstance();

No lugar de pegar a classe Modelo do meu JAR que está no mesmo diretório, este animal pegou do fonte do programa do eclipse. Ou seja, mostrando a versao da codificação do fonte e nao do jar.

Criado 21 de maio de 2009
Ultima resposta 22 de mai. de 2009
Respostas 5
Participantes 2