[Resolvido] Pegar instancia da classe já foi instanciada

Como faço para pegar a instancia de uma classe ?

Tenho este exemplo que funciona:

Produto produto = new Produto();

produto.getClass().getMethod("getNome").invoke(registro);

Agora dentro de produto tenho outra classe e quero pegar a informação, exemplo:

Produto produto = new Produto();
produto.setEstoque(new Estoque());

produto.getClass().getMethod("getEstoque").getReturnType().getMethod("getQuantidade").invoke(registro.getEstoque());

preciso passar a instancia como parametro para o invoke e para isso preciso passar como Object.

Se fosse uma instancia nova seria assim eu acho:

registro.getClass().getMethod("getTabela").getReturnType().newInstance()

Que outra classe?
Você só está acessando os métodos através de reflection, não está acessando outra classe.

Sua instância é a variável produto, é só passar ela.

Eae staroski,

Dentro de Produto eu tenho uma outra Classe Estoque, exemplo

class Produto {

     private int codigo;
     private string nome;

     private Estoque estoque;

     public int getCodigo() { return codigo; }

     public void setCodigo(int codigo) { this.codigo = codigo }

     public Estoque getEstoque() { return estoque; }

     public void setEstoque(Estoque estoque) { this.estoque = estoque; }

O que eu preciso é algo tipo iReport, qdo eu passo os Fields
$F{estoque.quantidade}

getProduto().getEstoque().getQuantidade();

Agora o que eu estou fazendo é isso mas da erro de cast

                    String[] as = {"Codigo", "Nome", "Estoque.Quantidade"};              

                    Produto produto = (Produto)registro.get(i);

                    Method m = null;
                    Object classe = produto.getClass();
                    for (String s : as) {
                        m = ((Class)cs).getMethod("get" + s);
                        cs = m.getReturnType();
                    }
                    return m.invoke(produto);           <--- Aqui funciona nos 2 primeiros elementos do array, mas no terceiro nao funciona pq a Tabela esta dentro de produto, se eu mudar para produto.getTabela() ai funcionaria.

Se tivesse como eu pegar a instancia da classe seria bom

Object aClasse = produto.getInstance();

Object aClasse = produto.getTabela().getInstance();

tendeu ?

Porque precisa usar reflection?
Você já tem a instância da sua classe, é o objeto que você chamou de produto.
Para obter o estoque é só chamar o método getEstoque() desse objeto.

Eu sempre vou saber a primeira Class, mas as subclasses podem mudar no caso de produtos, tenho Estoque, Tabela, WA e etc, no caso de clientes, tenho endereco, transportadora e etc.

Partindo da primeira Class quero pegar as outras, como neste caso:

String[] as = {“Codigo”, “Nome”, “Estoque.Quantidade”, “Tabela.Custo”, “WA.Quadra”};

Não quero usar switch ou if else

Veja se o código abaixo te ajuda a entender como fazer:

Produto objetoProduto = new Produto();
objetoProduto.setEstoque(new Estoque());

Class<?> classeProduto = objetoProduto.getClass();
Method metodoGetEstoque = classeProduto.getMethod("getEstoque");

Object objetoEstoque = metodoGetEstoque.invoke(objetoProduto); // obtendo a instância de Estoque a partir da instância de Produto
Class<?> classeEstoque = metodoGetEstoque.getReturnType();

Method metodoGetQuantidade = classeEstoque.getMethod("getQuantidade");
Object quantidade = metodoGetQuantidade.invoke(objetoEstoque);

Depois de tantos anos nessa indústria vital… Eu aprendi que nem toda generalização é boa.
Talvez o ideal seja você tratar cada caso de acordo com o que cada caso necessitar.

1 curtida

Staroski era isso mesmo que eu precisava… o secredo era usar o invoke antes durante e depois rsrsrs

vc é o cara !

darlan_machado concordo em partes na questao da generalização e concordo plenamente no caso de casa caso ser um caso. rs

Vlw povo pela ajuda hein !