Considerando o Java padrão, não existe um jeito fácil. O java não implementa o paradigma de programação reflexiva, portanto, esse tipo de coisa não existe.
Há algumas formas de simular esse comportamento.
A primeira possibilidade seria integrar um motor de scripts no seu código. Essa, provavelmente, é a alternativa que te atenderá. Geralmente, quando precisamos de coisas mais dinâmicas, ou criadas por nossos usuários, nós embarcamos uma linguagem de script como Groovy ou JavaScript. Assim, o usuário pode, em tempo de execução, escrever uma classe (ou implementar uma interface) e nós podemos chamar seus métodos.
Dê uma olhada em:
http://groovy.codehaus.org/Embedding+Groovy
http://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_guide/
O motor da linguagem de script inclui um compilador, e frequentemente a linguagem usada possui mecanismos de inserção de código em tempo de execução. A vantagem também é que uma linguagem de script costuma a ter uma sintaxe mais simples, dinâmica, além de ter mecanismos para controlar políticas de segurança que permitem dizer o quanto o usuário poderá acessar do seu código. Por fim, esses scripts poderiam ser carregados de um arquivo, do banco, da rede, ou mesmo digitados pelo usuário em um editor de textos. Eles também podem ser pré-compilados e deixados na forma binária em algum local para ter sua execução acelerada.
A segunda alternativa seria criar um HashMap<String, Object> de propriedades adicionais. Assim seria possível fazer algo como:
propriedades.put("Nome", "Vinícius");
propriedades.put("calcularSalario", () -> {
return this.salario * this.bonificacao;
});
propriedades.put("calcularAumento", (taxa) -> {
return this.salario *= 1.0 + taxa;
});
Claro que usar essas propriedades pode ser um pouco mala, já que você terá que testar por seu tipo. Mas isso é inevitável em código criado em tempo de execução. Ficaria mais simples se você separar mapas diferentes para funções e tipos de dados. Uma chamada (insegura) poderia ser:
//Dá aumento de 5%
metodos.get("calcularAumento")(0.05);
Outro mecanismo interessante do Java é a criação de Proxies dinâmicos:
Mas estes já devem ser conforme a uma interface especificada por você.
Fora do java padrão, você teria que recorrer a bibliotecas como o já citado JavaAssist.