fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6. import java.lang.reflect.*;
  7.  
  8. /* Name of the class has to be "Main" only if the class is public. */
  9. class Ideone
  10. {
  11.  
  12. private static Object invokeMethodPrivateClassBase(
  13. Class<?> clazz,
  14. Object instance,
  15. String nameMethod,
  16. List<Class<?>> paramsTypeClazz,
  17. Object... args) {
  18. try {
  19. //localiza o método
  20. Method method = clazz.getDeclaredMethod(
  21. nameMethod,
  22. paramsTypeClazz.toArray(new Class[paramsTypeClazz.size()]));
  23. //torna-o acessível mesmo sendo private
  24. method.setAccessible(true);
  25. //verifica se tem argumentos variados
  26. if (method.isVarArgs()) {
  27. //cria um arrau de parâmetros que deve ter a exata quantidade de parâmetros declarados,
  28. //isto é, sem considerar os argumentos variantes
  29. Object[] parameters = new Object[paramsTypeClazz.size()];
  30. //copia os parâmetros fixos para o novo array, desconsiderando apenas o último que é variante
  31. System.arraycopy(args, 0, parameters, 0, paramsTypeClazz.size() - 1);
  32. //calcula quantos argumentos variantes foram passados
  33. int varArgsSize = args.length - paramsTypeClazz.size() + 1;
  34. //cria um array com o tipo dos parâmetros variantes
  35. Object varArgsParameter = Array.newInstance(
  36. paramsTypeClazz.get(paramsTypeClazz.size() - 1).getComponentType(),
  37. varArgsSize);
  38. //copia todos os demais argumentos para o array de argumentos variantes
  39. System.arraycopy(args, paramsTypeClazz.size() - 1, varArgsParameter, 0, varArgsSize);
  40. //coloca o array de argumentos variantes como último parâmetro para o método a ser chamado
  41. //isso porque o "..." equivale a um array
  42. parameters[paramsTypeClazz.size() - 1] = varArgsParameter;
  43. //chama o método
  44. return method.invoke(instance, parameters);
  45. } else {
  46. return method.invoke(instance, args);
  47. }
  48. } catch (Throwable e) {
  49. //apenas para teste
  50. System.out.println(e.getMessage());
  51. }
  52. return "Y";
  53. }
  54.  
  55. /**
  56. * Método de exemplo a ser chamado via reflexão
  57. */
  58. public String meuMetodo(String label, Integer... valores) {
  59. Integer soma = 0;
  60. for (Integer v : valores) soma += v;
  61. return label + ": " + soma;
  62. }
  63.  
  64. public static void main (String[] args) throws java.lang.Exception {
  65.  
  66. //modo normal
  67. System.out.println(new Ideone().meuMetodo("S1", 3, 4, 1));
  68.  
  69. //prepara lista de tipos dos argumentos
  70. List<Class<?>> paramsTypeClazz = new ArrayList<Class<?>>();
  71. paramsTypeClazz.add(String.class);
  72. paramsTypeClazz.add(Integer[].class);
  73.  
  74. //modo reflexivo
  75. System.out.println(Ideone.invokeMethodPrivateClassBase(
  76. Ideone.class,
  77. new Ideone(),
  78. "meuMetodo",
  79. paramsTypeClazz,
  80. "S1", 3, 4, 1));
  81. }
  82. }
Success #stdin #stdout 0.07s 380160KB
stdin
Standard input is empty
stdout
S1: 8
S1: 8