gpt4 book ai didi

java - 如何测试类中是否存在私有(private)静态函数,而不必捕获 NoSuchMethodException?

转载 作者:行者123 更新时间:2023-12-01 17:13:58 28 4
gpt4 key购买 nike

我正在创建一个实用函数,它返回 Method给定其所有部分的对象。其参数:

  • 返回类型 ( Class<?> )
  • 包含类 ( Class<?>[] )
  • 函数名称 ( String )
  • 参数类数组 ( Class<?>[] )

注意包含类参数是一个数组。这些类中必须有一个恰好包含该方法,但您无法知道是哪一个。除了可以显式指定的类之外,这是指定默认类的一种方式。

我的目标是按顺序搜索该数组中的每个类,如果它包含该方法,则返回其 Method目的。我想这样做,而不必 try catch NoSuchMethodException (如 this question 中所述)。由于该方法可能是私有(private)的,因此使用 Class.getMethods() 不可能。

(它还允许私有(private)静态,但我不确定这是否会影响这个问题。)

如何通过这种方式搜索私有(private)方法?如何进行“类中是否存在函数”测试,而不必使用 NoSuchMethodException作为“错误”逻辑?

更多信息:https://www.google.com/search?q=class+contains+method+java

最佳答案

使用getDeclaredMethods它返回所有方法,包括非公开的方法。

for(Class<?> cls : classesToCheck) {
for(Method m : cls.getDeclaredMethods()) {
if(!m.getName().equals(methodName))
continue;
if(m.getReturnType() != returnType)
continue;

Class<?>[] pams = m.getParameterTypes();
if(pams.length != pamsToCheckFor.length)
continue;

int i;
for(i = 0; i < pams.length; i++) {
if(pams[i] != pamsToCheckFor[i])
break;
}

if(i == pams.length)
return m; // or return true
}
}

// not found

这是一项相当大的工作,但肯定可以完成。

请注意,如果您经常使用相同的类执行此类操作,您可能希望将 Method 对象存储在本地某处,例如 HashMap。每次调用 getFields/getMethods/getConstructors/etc 都会创建一个新数组,并复制其中的所有对象。只是为了找到一件事是一项相对昂贵的操作。

作为琐事,有一个名为 sun.reflect.ReflectionFactory 的类可以制作这些防御性副本。

java.lang.Class 的源代码还表明,getMethodgetDeclaredMethod 之类的方法所做的事情与上面的代码片段惊人地相似除非他们可能不复制。因此,作为性能优化的一部分,复制是需要权衡的。如果不存在的方法被认为是不太可能的结果,除非您像我建议的那样缓存方法,否则搜索数组实际上可能不会更快。

考虑搜索像java.lang.String这样的类。这是一个相当大的类,在其上调用 getDeclaredMethods 将会创建相当大量的对象。

关于java - 如何测试类中是否存在私有(private)静态函数,而不必捕获 NoSuchMethodException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876120/

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