Listar Conteudo Jar para Reflection

5 respostas
fabioebner

Pessoal, tem como eu listar as classes que estao dentro de um JAR para dar um reflection nelas??

eu preciso passado um determinado JAR eu liste todas as classes dele e faca um reflection em determinadas classes(sempre q ela extender um JFrame)

e possivel issu(a parte do reflection e tal ja esta feito, quero saber a de listar as classes)?

abracos

5 Respostas

T

Se o JAR estiver no seu CLASSPATH (ou seja, se você der um Class.forName e conseguir obter a classe), então basta listar o conteúdo do Jar. Vou dar um exemplo depois.

fabioebner

entao cara eu sei o diretorio q esta o jar… e o nome do jar

T
import java.awt.Rectangle;
import java.io.IOException;
import java.util.Collections;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;

public class ListarJar extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JTextArea txaClasses = null;

	private JButton btnProcessar = null;

	private JTextField txtNomeJar = null;

	private JScrollPane jScrollPane = null;

	private JLabel jLabel = null;

	/**
	 * This method initializes txaClasses	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getTxaClasses() {
		if (txaClasses == null) {
			txaClasses = new JTextArea();
			txaClasses.setEditable(false);
		}
		return txaClasses;
	}

	/**
	 * This method initializes btnProcessar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnProcessar() {
		if (btnProcessar == null) {
			btnProcessar = new JButton();
			btnProcessar.setBounds(new Rectangle(15, 240, 106, 31));
			btnProcessar.setText("Processar!");
			btnProcessar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					processar();
				}
			});
		}
		return btnProcessar;
	}

	/**
	 * This method initializes txtNomeJar	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtNomeJar() {
		if (txtNomeJar == null) {
			txtNomeJar = new JTextField();
			txtNomeJar.setBounds(new Rectangle(15, 195, 391, 31));
		}
		return txtNomeJar;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(15, 5, 391, 161));
			jScrollPane.setViewportView(getTxaClasses());
		}
		return jScrollPane;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				ListarJar thisClass = new ListarJar();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public ListarJar() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(443, 312);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
		this.getRootPane().setDefaultButton(btnProcessar);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabel = new JLabel();
			jLabel.setBounds(new Rectangle(22, 175, 384, 14));
			jLabel.setText("Digite abaixo o nome do arquivo .jar, e clique em Processar:");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getBtnProcessar(), null);
			jContentPane.add(jLabel, null);
			jContentPane.add(getTxtNomeJar(), null);
		}
		return jContentPane;
	}

	public void processar() {
		try {
			ZipFile zf = new ZipFile (txtNomeJar.getText());
			for (ZipEntry ze : Collections.list(zf.entries())) {
				if (!ze.isDirectory()) {
					if (ze.getName().endsWith (".class")) {
						String className = ze.getName().replace('/', '.').substring(0, ze.getName().length() - 6);
						txaClasses.setText (txaClasses.getText() + className + "\n");
					}
				}
			}
		} catch (IOException e) {
			showStackTrace (e);
		}
	}
	
	private void showStackTrace (Throwable thr) {
		StringBuilder msg = new StringBuilder();
		for (StackTraceElement ste : thr.getStackTrace()) {
			msg.append (ste.toString()).append ("\n");
		}
		JOptionPane.showMessageDialog (this, msg, "Erro!", JOptionPane.ERROR_MESSAGE); 
	}
	
	
}  //  @jve:decl-index=0:visual-constraint="10,10"
fabioebner

ae mlkao ficou classe A… agora tem uma coisa. eu fiz o seguinte:

ZipFile zf = new ZipFile ("ControleUsuario.jar");  
             for (ZipEntry ze : Collections.list(zf.entries())) {  
                 if (!ze.isDirectory()) {  
                     if (ze.getName().endsWith (".class")) {  
                         String className = ze.getName().replace('/', '.').substring(0, ze.getName().length() - 6);  
                         System.out.println(className); 
                         Class cls = Class.forName(className);

                              ************************ AQUI **********************
                         }
                     }  
                 }  
             }  
         } catch (IOException e) {  
             e.printStackTrace();
        }

como eu faco para no lugar indicado verificar se essa classe EXTEND um JFrame??? tem como fazer isso??

abracos

T
if (JFrame.class.isAssignableFrom (cls)) 
    ....

É esquisito, porque é ao contrário de “instanceof” (objeto instanceof Classe), mas é assim mesmo.

Criado 4 de junho de 2008
Ultima resposta 4 de jun. de 2008
Respostas 5
Participantes 2