带参数的 Java Reflection 私有(private)方法最好的方法?

标签 java reflection methods parameters private

我正在尝试使用 java 反射调用私有(private)方法我开发了一个小方法来调用其他方法迭代所有方法并按名称和参数类型进行比较我已经成功调用了 4 个方法。

我有一个问题。

1).这是最好的方法吗?因为我知道 class.getMethod 只匹配公共(public)方法。 Java 有内置的东西吗?

这是我的代码。

public class Compute 
{   
   private Method getMethod(Class clazz,String methodName,Class...parametersClass)
   {   
      outer:     
      Method[] methods = clazz.getDeclaredMethods();        
      for(Method method:methods)
    {       
        //comparing the method types... of the requested method and the real method.....                  
        if(method.getName().equals(methodName) && parametersClass.length== method.getParameterTypes().length)//it a possible match
        {                
            Class[]arrayForRealParameters = method.getParameterTypes();
            //comparing the method types... of the requested method and the real method.....    
            for(int i=0;i<arrayForRealParameters.length;i++)if(!arrayForRealParameters[i].getSimpleName().equals(parametersClass[i].getSimpleName()))continue outer;
            return method;
        }
    }
    return null;    
}
private Calendar getCalendar(){return java.util.Calendar.getInstance();}
private void methodByReflex(){System.out.println("Empty Parameters.");}
private void methodByReflex(Integer a,Integer b){System.out.println(a*b);}
private void methodByReflex(String a,String b){System.out.println(a.concat(b));}
public static void main(String[] args) throws Exception
{
    Compute clazz = new Compute();
    Class[]arrayOfEmptyClasses=new Class[]{};
    Class[]arrayOfIntegerClasses=new Class[]{Integer.class,Integer.class};
    Class[]arrayOfStringClasses=new Class[]{String.class,String.class};
    Method calendarMethod=clazz.getMethod(clazz.getClass(),"getCalendar",arrayOfEmptyClasses);
    Method emptyMethod=clazz.getMethod(clazz.getClass(),"methodByReflex",arrayOfEmptyClasses);
    Method intMethod=clazz.getMethod(clazz.getClass(),"methodByReflex",arrayOfIntegerClasses);
    Method stringMethod=clazz.getMethod(clazz.getClass(),"methodByReflex",arrayOfStringClasses);        
    System.out.println((calendarMethod==null)+" "+(emptyMethod==null)+" "+(intMethod==null)+" "+(stringMethod==null));//prints false false false false
    Calendar cal = (Calendar)calendarMethod.invoke(clazz);
    System.out.println(cal.getTime());//prints current time
    stringMethod.invoke(clazz,"John ","Lennon");//Prints John Lennon
    emptyMethod.invoke(clazz);//prints Empty Parameters.
    intMethod.invoke(clazz,13,13);// prints 169
    Integer a=10,b=10;
    intMethod.invoke(clazz,a,b);//prints 100
}

任何帮助都将不胜感激。 非常感谢。

最佳答案

您将使用 getDeclaredMethods 获取类中所有方法的列表。尝试使用 getDeclaredMethod (单数)方法,它将方法名称和参数类型类的可变参数参数作为参数。这应该让您直接进入方法,这样您就不必自己遍历所有方法。

例子:

clazz.getDeclaredMethod(methodName, parametersClass);

关于带参数的 Java Reflection 私有(private)方法最好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288393/

相关文章:

javascript - 无法在提示框中写入数字

c# - 在 XSLT 扩展方法的返回值上使用 Xpath

java - ARCore Android SDK – 如何在Transformable节点上制作缩放动画?

java - 从设备读取数据?

java - Spring Boot 配置文件 - 运行 sql 脚本而不是 ddl-auto

java - 如何在java中获取接入点的MAC地址?

.net - 如何在部分信任环境(无 FileIOPermission)中访问我的程序集版本号

c# - Activator.CreateInstance(...) 未找到参数化构造函数

c# - C# 中的反射会失败吗?

swift - 测量调用方法 "didUpdateValueFor"之间的时间