¿Cómo obtener el tipo genérico en tiempo de ejecución?

Este es mi código: ExecutorImp extiende AbstractExecutor que extrae las mismas lógicas de ejecución de sus implementadores (ExecutorImp es un caso), al llamar al método execute () de ExecutorImp, llamará al método en su supertipo, pero el supertipo (AbstractExcutor ) debería conocer otra clase de enlace al implementador (en el ejemplo, es la clase Usuario):

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

abstract class AbstractExecutor<E> {
    public void execute() throws Exception {
        ArrayList<E> list = new ArrayList<E>();
        // here I want to get the real type of 'E'
        Class cl = this.getClass().getTypeParameters()[0].getGenericDeclaration().getClass();
        Object o = cl.getConstructor(String.class).newInstance("Gate");
        list.add((E) o);
        System.out.println(format(list));
    }
    public abstract String format(ArrayList<E> list);
    public abstract String getType();
}

public class ExectorImp<E> extends AbstractExecutor<User> {
    @Override
    public String getType() {
        return "user";
    }
    @Override
    public String format(ArrayList<User> list) {
        StringBuffer sb = new StringBuffer();
        for (User u : list) {
            sb.append(u.toString() + " ");
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        new ExectorImp().execute();
    }
}
class User {
    String name;
    public User(String name) {
        this.name = name;
    }
}

Entonces, ¿cuál es el problema con mis códigos?

Respuestas a la pregunta(4)

Su respuesta a la pregunta