// -*- coding: utf-8 -*-
// ---
// jupyter:
//   jupytext:
//     text_representation:
//       extension: .java
//       format_name: light
//       format_version: '1.5'
//       jupytext_version: 1.14.4
//   kernelspec:
//     display_name: Java
//     language: java
//     name: java
// ---

// ## API de Reflexão
//
// A API de reflexão (Reflection API) permite retornar os metadados dos objetos e os objetos em tempo de execução. 
//
// É possível recuperar o nome de uma classe, seus atributos e métodos, sem uma referência explícita no programa em tempo de compilação. Uma das aplicações comuns de uma API de reflexão é a implementação de um **debugador**. 
//
// O código abaixo possui alguns exemplos simples da API de reflexão.
// Este código:
// - carrega uma classe ArrayList;
// - retorna todos os atributos;
// - retorna todos os métodos;
// - instancia um objeto ArrayList;
// - retorna o tipo do atributo 'size';
// - retorna o tipo de retorno do método 'size()';
// - chama o método size 2 vezes, com tamanho do Array diferentes.
//
//
// Um tutorial com todas as possibilidades está disponível na página [https://docs.oracle.com/javase/tutorial/reflect/index.html](Trail: reflection API).

// +
import java.lang.reflect.*;

class Programa {

    
    public static void main () throws Exception {
        Class c = Class.forName("java.util.ArrayList");
        System.out.println(c.getName());
        
        int i = 0;
        for (Field f : c.getDeclaredFields()){
            System.out.println(f.getName());
            i++;            
        }
        System.out.println("Número de atributos:"+i+"\n");
        i=0;
        for (Method m : c.getMethods()){
            //System.out.println(m.getName());
            i++;
        }
        System.out.println("Número de métodos:"+i+"\n");        
        
        
        ArrayList lista = (ArrayList)c.newInstance();
        c.getDeclaredField("size").setAccessible(true);
        System.out.println("Tipo do atributo size: "+c.getDeclaredField("size").getType());
        
        Method m = c.getMethod("size",new Class[]{});
        
        System.out.println("tipo de retorno do método size: "+m.getReturnType());
        
        System.out.println("tamanho da lista, chamando o método size: "+m.invoke(lista,new Object[]{}));
        
        lista.add(25);
        
        System.out.println("tamanho da lista, chamando o método size: "+m.invoke(lista,new Object[]{}));
        
        
    }
}

Programa.main();

// -







StarcoderdataJupyterScriptsDedupFiltered