- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个实用函数,它返回 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
的源代码还表明,getMethod
和 getDeclaredMethod
之类的方法所做的事情与上面的代码片段惊人地相似除非他们可能不复制。因此,作为性能优化的一部分,复制是需要权衡的。如果不存在的方法被认为是不太可能的结果,除非您像我建议的那样缓存方法,否则搜索数组实际上可能不会更快。
考虑搜索像java.lang.String
这样的类。这是一个相当大的类,在其上调用 getDeclaredMethods 将会创建相当大量的对象。
关于java - 如何测试类中是否存在私有(private)静态函数,而不必捕获 NoSuchMethodException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876120/
我是一名优秀的程序员,十分优秀!