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??
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();
}
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.
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??
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.
[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
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!!