O Java Reflection é bastante poderoso e pode ser muito útil. O Java Reflection possibilita inspecionar classes, interfaces, campos e métodos em tempo de execução, sem saber os nomes das classes, métodos etc. em tempo de compilação. Também é possível instanciar novos objetos, chamar métodos e obter / definir valores de campo usando reflexão.
Um exemplo rápido do Java Reflection para mostrar como é o uso do reflexo:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Este exemplo obtém o objeto Class da classe chamada MyObject. Usando o objeto de classe, o exemplo obtém uma lista dos métodos nessa classe, itera os métodos e imprime seus nomes.
Exatamente como tudo isso funciona é explicado aqui
Edit : Depois de quase 1 ano, estou editando esta resposta, enquanto lia sobre reflexão, recebi mais alguns usos do Reflection.
- O Spring usa a configuração de bean, como:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Quando o contexto do Spring processar esse elemento <bean>, ele usará Class.forName (String) com o argumento "com.example.Foo" para instanciar essa classe.
Ele usará novamente a reflexão para obter o configurador apropriado para o elemento <property> e definir seu valor para o valor especificado.
- O Junit usa o Reflection especialmente para testar métodos Privado / Protegido.
Para métodos particulares,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
Para campos particulares,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);