java – Create a method that takes a generic class?


I've been racking my brain with the Reflection API. I'm writing a class (reader) that reads a CSV file and creates an ArrayList of objects based on CSV. I made a test class to write the code, but I want to adapt the code so that it works with whatever class is passed. (main)

import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

public class Principal {

    public static void main(String[] args) {

        ArrayList<Object> listaDeObjetos;
        Leitor objetoDaClasseLeitor = new Leitor();

        Path caminho = Paths.get("/home/filipe/eclipse-workspace/ReadCSVFile/src", "a.csv");
        Charset codificacao = Charset.forName("UTF-8");
        String separador = ",";
        ClasseDeTeste classe;
        classe = new ClasseDeTeste();

        try {
            System.out.println(objetoDaClasseLeitor.leArquivo(caminho, codificacao, separador, classeCriada));
        } catch (Exception e) {
            // TODO Auto-generated catch block



public class ClasseDeTeste {
    String id;
    String nome;
    String telefone;
    String email;

    public void setId(String id) { = id;

    public void setNome(String nome) {
        this.nome = nome;

    public void setTelefone(String telefone) {
        this.telefone = telefone;

    public void setEmail(String email) { = email;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.List;

public class Leitor {

    List<String> linhas;
    String texto;
    ArrayList<Object> objetosCriados = new ArrayList<>();
    String[] colunas;
    Class<?> classePassada;

    ArrayList<Object> leArquivo(Path caminho, Charset codificacao, String separador, ClasseDeTeste classe) throws Exception {
        // Lê e processa o arquivo

        linhas = Files.readAllLines( caminho, codificacao );
        colunas = linhas.get(0).split(separador);

        //Crio um array para o nome dos setters
        String[] nomeDosSetters = new String[colunas.length];       

        //Transformo o nome das Colunas para um SetNome
        for(int i = 0; i < colunas.length; i ++){
            String nomeDoMetodo;
            nomeDoMetodo = ("set" + colunas[i].substring(0, 1).toUpperCase() +

            nomeDosSetters[i] = nomeDoMetodo; 

        //Crio uma nova instância com o nome da classe passada
        classePassada = classe.getClass();

        //Crio um Array de Objetos, será o array a ser retornado no final 
        for(int i = 1; i < linhas.size(); i++) {

        //Percorro as linhas (objetos) do csv
        for(int i = 1; i < linhas.size(); i++) {
            String[] valores = linhas.get(i).split(separador);

            //Percorro os valores de cada linha (objeto) do csv
            for(int j = 0; j < valores.length; j++) {
                Method setter2 = classePassada.getMethod(nomeDosSetters[j], String.class);
                setter2.invoke(objetosCriados.get(i-1), valores[j]);

        return objetosCriados;


I want my leFile method to accept any passed class, and for that it look like:

ArrayList<Object> leArquivo(Path caminho, Charset codificacao, String separador, **Class<?> classe**) throws Exception {

It turns out that when I go from

ClasseDeTeste classe


Class<?> classe

My main file stops working and I can't solve it. Any idea what might be going on?


If I understand correctly, you don't need a Class<?> classe in your Leitor class. Just use the class informed in the leArquivo(...) method parameter in your logic.


1) Your method signature must read:

ArrayList<Object> leArquivo(Path caminho, Charset codificacao, String separador, Class<?> classe) throws Exception

2) In your logic in the Leitor class, for example, in this excerpt:

//Crio um Array de Objetos, será o array a ser retornado no final 
for(int i = 1; i < linhas.size(); i++) {

You will, instead of using classePassada.newInstance() , use classe (which came from the parameter) and go along with your logic.

Even simpler example:

class Leitor {
    void exibirInfosDaClasse(Class<?> clazz){
        //uso direto clazz, não tenho necessidade de ter uma propriedade dentro da classe

class ClasseQualquer {
    public void metodo1(){};
    public void metodo2(){};

public final static void main(String... args) throws Exception {
        Leitor leitor = new Leitor();
//[public void ClasseQualquer.metodo1(), public void ClasseQualquer.metodo2() etc...]
Scroll to Top