Dúvidas Biblioteca Reflections

Bom dia, pessoal.

Estou precisando de utilizar alguns casos de Reflexão, pelo que vi no Java eu consigo instanciar uma classe através do nome desde que ela tenha um Construtor sem atributos dessa forma:

Mas eu preciso de algo diferente, eu precisaria obter todas as classes de um determinado Package e realizar ações de acordo com a Annotation de cada uma delas.
Após algumas pesquisas acabei chegando neste link:

http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection

Que me levou até este projeto:

http://code.google.com/p/reflections/

Gostaria de saber se alguém já utilizou esta Lib, pois estou tentando adicioná-la ao meu projeto e não consigo fazer os imports dela.

E estava pesquisando pelo que entendi ela não é bem uma Lib como as que eu estava acostumado a adicionar aos projetos, ela é uma Jar que contém várias outras Jar dentro dela que seriam as Libs.

Mas não sei como adicionar dessa maneira, alguém poderia me ajudar?

Obrigado desde já.

Normalmente nos projetos que envolvem anotaçẽs voce precisa registrar os .class para serem lidos programaticamente na hora de usar.

Cuidado com reflection no Android, pois ao dar um ant release para gerar o aplicativo final para utilização, ele vai rodar um obfuscador que vai alterar os arquivos finais e vai quebrar seu codigo reflexivo, nesse caso é necessario adicionar as classes que voce quer manter no proguard.cfg do projeto.

[quote=Marky.Vasconcelos]Normalmente nos projetos que envolvem anotaçẽs voce precisa registrar os .class para serem lidos programaticamente na hora de usar.

Cuidado com reflection no Android, pois ao dar um ant release para gerar o aplicativo final para utilização, ele vai rodar um obfuscador que vai alterar os arquivos finais e vai quebrar seu codigo reflexivo, nesse caso é necessario adicionar as classes que voce quer manter no proguard.cfg do projeto.[/quote]

Desculpa a ignorância, eu entendi mais ou menos.

Eu estou pensando em optar por um caminho mais simples mesmo e depois vejo essa parte de utilizar Jar que cuidam da parte de Reflection.

Eu conseguiria por exemplo após instanciar uma classe dessa maneira:

Acessar os métodos e setar propriedades da classe?

Obrigado pela atenção.

Voce consegueria sim, mas não vejo vantagens se o caso for criar todos métodos reflexivos para set/get do que fazer diretamente com o objeto.

Como assim fazer diretamente com o Objeto?

Invés de:

Field f = clazz.lookUp("campoX");
f.set(objeto, "valor");

Fazer diretamente:

objeto.setCampoX("valor");

A não ser que a magica do reflection esteja escondida.

[quote=Marky.Vasconcelos]Invés de:

Field f = clazz.lookUp("campoX");
f.set(objeto, "valor");

Fazer diretamente:

objeto.setCampoX("valor");

A não ser que a magica do reflection esteja escondida.[/quote]

Marky, desculpa minha ignorância. Mas justamente estava tentando fazer esse tipo de acesso achei que não era possível pois não estou conseguindo.

Eu estou tentando fazer a Reflexão a partir da minha classe de Persistência, pois preciso de um método dinâmico que carregue uma Classe, leia suas propriedades e carregue ela com o retorno do Web Service antes de gravar no SQLite.

Então tirando todo o processo de Web Service que está funcionando estou fazendo assim:

Classe Embalagem:

[code]public class Embalagem extends Persistencia implements Parcelable{

private Integer Codigo;
private String Descricao;

public Integer getCodigo() {
	return Codigo;
}

public void setCodigo(Integer codigo) {
	Codigo = codigo;
}

public String getDescricao() {
	return Descricao;
}

public void setDescricao(String descricao) {
	Descricao = descricao;
}[/code]

E na Persistência eu tenho o meu método de Importação que está tentando Instanciar um Objeto da Classe Embalagem da seguinte maneira:

[code] Class classeGenerica = Class.forName(“teste.attributes.Embalagem”);

                Object objCls = classeGenerica.newInstance();[/code]

Tudo bem até aí, quando eu passo pela linha que me dá uma nova instancia, meu objCls exibe as propriedades dele e as que ele estende da Persistencia, mas eu não consigo acessar os get’s e os set’s da classe por este objeto.
Como que eu faria isto exatamente?

Eu estava tentando da maneira que você falou.

Como não estava conseguindo, olhei na internet e vi em diversos lugares que o pessoal obtém primeiro o Field ou o Method para depois tentar invocá-lo e também não funcionou desta maneira.

Tem algo que estou esquecendo ou estou fazendo errado para isto não funcionar?

Obrigado desde já pela atenção.

Nesse exemplo, em ambos objetos (p1 e p2) vão ser invocados o setName.

    public static void main(String[] args) throws Throwable {
        Class<?> clazz = Class.forName("br.Person");
        Method setter = clazz.getMethod("setName", String.class);
        
        Object p1 = clazz.newInstance();
        Person p2 = new Person();
        
        Object[] setArgs = new Object[]{"Mark"};

        setter.invoke(p1, setArgs);
        setter.invoke(p2, setArgs);
    }
    
package br;
    public class Person {
        private String name;
        
        public void setName(String name) {
            this.name = name;
        }
    }