Cast em Reflection

Pessoal como eu faco o cast de um Field com reflection… exemplo:

eu dei um getDeclaredFields() para cada field q ele me retornar eu queria transformar ele em um JLabel ou JScrollPanel, ou JTextEdit, depende do tipo do objeto q esta sendo retornado

preciso acessar a algumas propriedades de cada objeto, tem cmo fazer isso??

abracos

Eu fiz assim:

        try {
            Teste t = new Teste();

            Field[] fields = t.getClass().getDeclaredFields();

            for (Field f : fields) {

                Object o = f.get(t);

                if (o instanceof JTextField) {
                    JTextField text = (JTextField) o;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Você pode verificar assim, exemplo:

        Object o = "c";        
        if(o instanceof String){
            System.out.println("true");
        }else{
            System.out.println("false");
        }

Já eu fiz assim, um exemplo:

for ( Field field : fields ) { if ( field.getType().equals( java.lang.String.class ) ) {
Aí você usa a classe que quiser no equals, e faz o que quiser dentro do if.

getDeclaredField retorna um Field, certo?

Field.getType() retorna um Class, que por sua vez tem o método cast().

[quote=Bruno Laturner]getDeclaredField retorna um Field, certo?

Field.getType() retorna um Class, que por sua vez tem o método cast().

[/quote]

Sim o cast funciona, mas aí você precisa tratar a class cast exception.

cara e quase isso. o unico problema e q eu nao sei quais sao as classes entao esse Teste t = new Teste() nao funciona… pois nao sei quais sao as classes. como eu posso contornar isso??

abracos

Você não sabe qual classe? A classe que você quer pegar os fields por reflection?

O Class também tem o método newInstance(), se o teu problema é instanciar.

entao o problema do newInstance() e q eu tenho q saber qual a Classe neh… teria q ser um MinhaClasse classe = (MinhaClasse) cls.newInstance();

mas e se caso eu nao souber essa MinhaClasse… pois a ideia e dar um list em um diretorio e fazer esse cast para cada classe q ele achar la…

A idéia não está clara ainda, poderia postar um pouco de código/pseudo-código p/ ajudar a entender exatamente a situação?

Cara eu faco assim… eu listo todas as classes q estao no diretorio GUI

logo em seguida para cada classe q eu encontrar eu preciso fazer o:

Classe cls = new Classe(); (POREM ESSSE CLASSE eu nao sei qual eh… so vou ter o caminho dela em uma String )

vou fazer o

Class cls = Class.forName( “br.com.dnasolution.gui.CadastroTela” );

AQUI EU TENHO Q CRIAR ESSA CLASSE DINAMICAMENTE

“CadastroTela” teste= (“CadastroTela”) cls.newInstance(); //ISSO PARA CADA CLASSE QUE EU ENCONTRAR NO DIRETORIO

entendeu??? para depois eu fazer o

[code]
Field[] fields = teste.getClass().getDeclaredFields();

        for (Field f : fields) {

            Object o = f.get(teste);

            if (o instanceof JTextField) {
                JTextField text = (JTextField) o;
                System.out.println(text.getText());
            }
            if (o instanceof JLabel) {
                JLabel text = (JLabel) o;
                System.out.println(text.getText());
                System.out.println(text.getToolTipText());
                Component c = text.getLabelFor();
                System.out.println(c.getName());
                
            }                
        }
    } catch (Exception ex) {
        ex.printStackTrace();[/code]

Vou mostrar um exemplo. Veja os métodos "alterarComponentes" e "alterarComponentes2". No primeiro caso uso "isAssignableFrom" e no segundo, "instanceof".

import java.awt.Color;
import java.awt.Component;
import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class ReflectionSample extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JButton btnOK = null;

	private JLabel lblTexto = null;

	private JTextField txtDados = null;

	private JSlider sldVolume = null;

	private JProgressBar prbProgresso = null;

	private JButton btnTeste2 = null;

	/**
	 * This method initializes btnOK	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnOK() {
		if (btnOK == null) {
			btnOK = new JButton();
			btnOK.setBounds(new Rectangle(15, 165, 106, 30));
			btnOK.setText("Clique aqui");
			btnOK.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					alterarComponentes();
				}
			});
		}
		return btnOK;
	}

	/**
	 * This method initializes txtDados	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtDados() {
		if (txtDados == null) {
			txtDados = new JTextField();
			txtDados.setBounds(new Rectangle(15, 50, 301, 31));
		}
		return txtDados;
	}

	/**
	 * This method initializes sldVolume	
	 * 	
	 * @return javax.swing.JSlider	
	 */
	private JSlider getSldVolume() {
		if (sldVolume == null) {
			sldVolume = new JSlider();
			sldVolume.setBounds(new Rectangle(15, 93, 301, 28));
		}
		return sldVolume;
	}

	/**
	 * This method initializes prbProgresso	
	 * 	
	 * @return javax.swing.JProgressBar	
	 */
	private JProgressBar getPrbProgresso() {
		if (prbProgresso == null) {
			prbProgresso = new JProgressBar();
			prbProgresso.setBounds(new Rectangle(10, 127, 306, 24));
		}
		return prbProgresso;
	}

	/**
	 * This method initializes btnTeste2	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnTeste2() {
		if (btnTeste2 == null) {
			btnTeste2 = new JButton();
			btnTeste2.setBounds(new Rectangle(150, 165, 166, 31));
			btnTeste2.setText("Clique aqui também");
			btnTeste2.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					alterarComponentes2();
				}
			});
		}
		return btnTeste2;
	}

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

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

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(347, 244);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			lblTexto = new JLabel();
			lblTexto.setBounds(new Rectangle(15, 17, 301, 23));
			lblTexto.setText("Texto");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getBtnOK(), null);
			jContentPane.add(lblTexto, null);
			jContentPane.add(getTxtDados(), null);
			jContentPane.add(getSldVolume(), null);
			jContentPane.add(getPrbProgresso(), null);
			jContentPane.add(getBtnTeste2(), null);
		}
		return jContentPane;
	}
	/**
	 * Pega os componentes deste JFrame por reflection
	 * e faz o seguinte:
	 * - Se for um JLabel, seta o texto para "Alterado";
	 * - Se for um JTextField, seta a cor de fundo para azul;
	 * - Se for um JSlider, seta o valor para 75%;
	 * - Se for um JProgressbar, seta o valor para 25%.
	 */
	private void alterarComponentes() {
		for (Component comp : jContentPane.getComponents() ) {
			Class<?> klass = comp.getClass();
			if (JLabel.class.isAssignableFrom (klass)) {
				((JLabel)comp).setText("Alterado");
			} else if (JTextField.class.isAssignableFrom (klass)) {
				((JTextField)comp).setBackground(Color.CYAN);
			} else if (JSlider.class.isAssignableFrom (klass)) {
				((JSlider)comp).setValue(75);
			} else if (JProgressBar.class.isAssignableFrom (klass)) {
				((JProgressBar)comp).setValue(25);
			}
		}
	}
	
	/**
	 * Pega os componentes deste JFrame sem usar reflection
	 * e faz o seguinte:
	 * - Se for um JLabel, seta o texto para "Normal";
	 * - Se for um JTextField, seta a cor de fundo para vermelho;
	 * - Se for um JSlider, seta o valor para 25%;
	 * - Se for um JProgressbar, seta o valor para 75%.
	 */
	private void alterarComponentes2() {
		for (Component comp : jContentPane.getComponents() ) {
			if (comp instanceof JLabel) {
				((JLabel)comp).setText("Normal");
			} else if (comp instanceof JTextField) {
				((JTextField)comp).setBackground(Color.RED);
			} else if (comp instanceof JSlider) {
				((JSlider)comp).setValue(25);
			} else if (comp instanceof JProgressBar) {
				((JProgressBar)comp).setValue(75);
			}
		}
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"

[quote=fabioebner] AQUI EU TENHO Q CRIAR ESSA CLASSE DINAMICAMENTE

“CadastroTela” teste= (“CadastroTela”) cls.newInstance(); //ISSO PARA CADA CLASSE QUE EU ENCONTRAR NO DIRETORIO
[/quote]
Creio que você não precise saber a classe. Basta você fazer:

Object teste = cls.newInstance();

Não importa que o tipo da variável teste é Object. O que importa é que o objeto em memória por ela referenciado é uma instância da classe representada por cls.
Teste isso e diga-nos se funcionou.

Algo como Field[] fields = cls.newInstance().getClass().getDeclaredFields();?

Edit: corrigido.

[quote=Mantu][quote=fabioebner] AQUI EU TENHO Q CRIAR ESSA CLASSE DINAMICAMENTE

“CadastroTela” teste= (“CadastroTela”) cls.newInstance(); //ISSO PARA CADA CLASSE QUE EU ENCONTRAR NO DIRETORIO
[/quote]
Creio que você não precise saber a classe. Basta você fazer:

Object teste = cls.newInstance();

Não importa que o tipo da variável teste é Object. O que importa é que o objeto em memória por ela referenciado é uma instância da classe representada por cls.
Teste isso e diga-nos se funcionou.[/quote]

Srs.
Me perdoem a ressureição :smiley:

Mas como vou executar o método da minha instância sendo que a referência é de Object??
Estou com o mesmo problema!!
Quase idêntico exceto por isso!!

[]'s