Reflection + JPanel

4 respostas
gregorioarthur

Galera,

Tem um método num aplicativo que estou mexendo que recebe um JPanel ou um awt.Container como parâmetro, no entanto preciso pegar os componentes que estão dentro deste painel (ou container).

Até ai blz! Só usar o método getComponents() porém, preciso somente dos componentes que possuem uma determinada anotação…

E ai? como fazer? Alguém tem alguma idéia? o máximo que consigo a mais é um objeto da classe que chamou o método.

4 Respostas

Marky.Vasconcelos

Voce pode usar Reflection para inspecionar a classe passada por parametro.

Voce pode fazer na mão, ou até usar essa classe utilitaria que criei no Towel.

Seria mais ou menos o seguinte:

ClassIntrospector clazz = new ClassIntrospector(objetoParametro.getClass());
//Para pegar todos os campos que tenham a anotação Resolvable
List<AnnotatedElement<Field, Resolvable>> list = clazz.getAnnotatedDeclaredFields(Resolvable.class);
//cada elemento de 'list' é um AnnotatedElement, que tem o Field que tem a anotação Resolvable, e o objeto Resolvable já é a anotação do campo.
gregorioarthur

A classe inteira eu consigo pegar de boa, preciso apenas do que dentro do panel… ou do container… Abaixo um exemplo do metodo que tem aqui:

private void builder(Container container) {
    
        /**
         * Como pegar os elementos do container que estejam com uma 
         * determinada annotaion?
         */
        
        for (Component c : container.getComponents()) {
        
            /**
             * Como saber se 'c' tem a annotation XYZ por exemplo?
             */
        }
    }

a unica coisa que tenho alem disso, é que a classe que tem este metodo tem um referencia pra classe que invoca os seus metodos (um Object).

wolmirGarbin

To meio sem tempo mas veja este codigo

//Pega as anotações dos campos
		Field[] fields = classe.getFields(); //pega todos os atributos da classe - pode ser metodos
		for(Field field : fields){ //dentro do for pegua as anotações 
			
			Annotation[] annotationsFields = field.getDeclaredAnnotations();
	
			for(Annotation annotation : annotationsFields){
				if(annotation instanceof Column){ //Verifica o tipo da anotação.. 
					Column column = (Column) annotation;
			        
					select.append(" "+ column.name());
					
			    }
				if(annotation instanceof Join){
					Join join = (Join) annotation;
					
			        joins.append(" "+ join.type() +" "+ prop.getProperty("select.join") +" "+ field.getName() );
			        
			    }
				//se for verificar outra anotação vai aqui
			}
		}

Espero que ajude… Valeu!

gregorioarthur

Obrigado cara, mas eu sei pegar as os campos anotados… normalmente.

So precisaria saber como fazer isso apenas recebendo um JPanel ou um Container como parametro.

Mas velew!

Criado 26 de abril de 2011
Ultima resposta 26 de abr. de 2011
Respostas 4
Participantes 3