gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:33:00 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com