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??
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.
B
Bruno_Laturner
getDeclaredField retorna um Field, certo?
Field.getType() retorna um Class, que por sua vez tem o método cast().
fiaux
Bruno Laturner:
getDeclaredField retorna um Field, certo?
Field.getType() retorna um Class, que por sua vez tem o método cast().
Sim o cast funciona, mas aí você precisa tratar a class cast exception.
fabioebner
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
fiaux
Você não sabe qual classe? A classe que você quer pegar os fields por reflection?
B
Bruno_Laturner
O Class também tem o método newInstance(), se o teu problema é instanciar.
fabioebner
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…
B
Bruno_Laturner
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?
fabioebner
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
Vou mostrar um exemplo. Veja os métodos "alterarComponentes" e "alterarComponentes2". No primeiro caso uso "isAssignableFrom" e no segundo, "instanceof".
importjava.awt.Color;importjava.awt.Component;importjava.awt.Rectangle;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JProgressBar;importjavax.swing.JSlider;importjavax.swing.JTextField;importjavax.swing.SwingUtilities;publicclassReflectionSampleextendsJFrame{privatestaticfinallongserialVersionUID=1L;privateJPaneljContentPane=null;privateJButtonbtnOK=null;privateJLabellblTexto=null;privateJTextFieldtxtDados=null;privateJSlidersldVolume=null;privateJProgressBarprbProgresso=null;privateJButtonbtnTeste2=null;/** * This method initializes btnOK * * @return javax.swing.JButton */privateJButtongetBtnOK(){if(btnOK==null){btnOK=newJButton();btnOK.setBounds(newRectangle(15,165,106,30));btnOK.setText("Clique aqui");btnOK.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEvente){alterarComponentes();}});}returnbtnOK;}/** * This method initializes txtDados * * @return javax.swing.JTextField */privateJTextFieldgetTxtDados(){if(txtDados==null){txtDados=newJTextField();txtDados.setBounds(newRectangle(15,50,301,31));}returntxtDados;}/** * This method initializes sldVolume * * @return javax.swing.JSlider */privateJSlidergetSldVolume(){if(sldVolume==null){sldVolume=newJSlider();sldVolume.setBounds(newRectangle(15,93,301,28));}returnsldVolume;}/** * This method initializes prbProgresso * * @return javax.swing.JProgressBar */privateJProgressBargetPrbProgresso(){if(prbProgresso==null){prbProgresso=newJProgressBar();prbProgresso.setBounds(newRectangle(10,127,306,24));}returnprbProgresso;}/** * This method initializes btnTeste2 * * @return javax.swing.JButton */privateJButtongetBtnTeste2(){if(btnTeste2==null){btnTeste2=newJButton();btnTeste2.setBounds(newRectangle(150,165,166,31));btnTeste2.setText("Clique aqui também");btnTeste2.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEvente){alterarComponentes2();}});}returnbtnTeste2;}/** * @param args */publicstaticvoidmain(String[]args){// TODO Auto-generated method stubSwingUtilities.invokeLater(newRunnable(){publicvoidrun(){ReflectionSamplethisClass=newReflectionSample();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true);}});}/** * This is the default constructor */publicReflectionSample(){super();initialize();}/** * This method initializes this * * @return void */privatevoidinitialize(){this.setSize(347,244);this.setContentPane(getJContentPane());this.setTitle("JFrame");}/** * This method initializes jContentPane * * @return javax.swing.JPanel */privateJPanelgetJContentPane(){if(jContentPane==null){lblTexto=newJLabel();lblTexto.setBounds(newRectangle(15,17,301,23));lblTexto.setText("Texto");jContentPane=newJPanel();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);}returnjContentPane;}/** * 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%. */privatevoidalterarComponentes(){for(Componentcomp:jContentPane.getComponents()){Class<?>klass=comp.getClass();if(JLabel.class.isAssignableFrom(klass)){((JLabel)comp).setText("Alterado");}elseif(JTextField.class.isAssignableFrom(klass)){((JTextField)comp).setBackground(Color.CYAN);}elseif(JSlider.class.isAssignableFrom(klass)){((JSlider)comp).setValue(75);}elseif(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%. */privatevoidalterarComponentes2(){for(Componentcomp:jContentPane.getComponents()){if(compinstanceofJLabel){((JLabel)comp).setText("Normal");}elseif(compinstanceofJTextField){((JTextField)comp).setBackground(Color.RED);}elseif(compinstanceofJSlider){((JSlider)comp).setValue(25);}elseif(compinstanceofJProgressBar){((JProgressBar)comp).setValue(75);}}}}// @jve:decl-index=0:visual-constraint="10,10"
Mantu
fabioebner:
AQUI EU TENHO Q CRIAR ESSA CLASSE DINAMICAMENTE
“CadastroTela” teste= (“CadastroTela”) cls.newInstance(); //ISSO PARA CADA CLASSE QUE EU ENCONTRAR NO DIRETORIO
Creio que você não precise saber a classe. Basta você fazer:
Objectteste=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.
B
Bruno_Laturner
Algo como Field[] fields = cls.newInstance().getClass().getDeclaredFields();?
Edit: corrigido.
neeryck
Mantu:
fabioebner:
AQUI EU TENHO Q CRIAR ESSA CLASSE DINAMICAMENTE
“CadastroTela” teste= (“CadastroTela”) cls.newInstance(); //ISSO PARA CADA CLASSE QUE EU ENCONTRAR NO DIRETORIO
Creio que você não precise saber a classe. Basta você fazer:
Objectteste=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.
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!!