thingol:
Uma variável não pode ter um tipo dinâmico, portanto você só poderia usar uma variável do tipo Object. Certo?
Para poder usar um método da tal classe, você tem de usar invoke mesmo, com o valor dessa variável do tipo Object. É por isso que invoke aceita um parâmetro do tipo Object, não um parâmetro de algum tipo mais restrituo.
Com Generics, é possível que uma variável tenha tipo dinâmico. Afinal, Generics é justamente isso.
Poderia fazer algo assim…
public <E> void metodo(Class<E> arg ", outros_parametros") {
...
E variavel = (E)metodoVO.invoke(vo).newInstance();
}
//Para chamar o metodo vc teria que informar qual vai ser a classe. Ex.:
public static void main(String... args){
//...instancia x
x.metodo(Cachorro.class ", outros argumentos");
O tipo genérico E poderia ter sido declarado na classe e aí não precisaria passar o tipo como parametro do metodo, mas precisaria acessar a classe usando o generico desejado (da maneira que acontece com as coleções).
Ainda assim, da maneira acima não teria como invocar os métodos de Cachorro
. Se vc quisesse, deveria restringir o tipo generico para um subtipo de Cachorro trocando <E> por <E extends Cachorro>… aí vc poderia chamar os metodos de Cachorro (mas nao poderia usar outros tipos que nao passem no teste E É-UM Cachorro).