gpt4 book ai didi

java - 反射 - 多个子类的方法缓存

转载 作者:行者123 更新时间:2023-11-30 06:22:37 25 4
gpt4 key购买 nike

我有一个abstract由多个具体类扩展的类。抽象类初始化 block 获取当前类层次结构的所有方法,搜索特定的带注释的方法。

ConcreteClass2 > ConcreteClass1 > AbstractClass
OtherConcrete1 > AbstractClass
<小时/>
{
...

final List<Method> methods = new ArrayList<>(16);
Clazz<?> clazz = getClass();

while (clazz != Object.class) {
for (final Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
methods.add(method);
}
}

clazz = clazz.getSuperclass();
}

METHODS.put(getClass(), methods);

...
}

这些具体类在 Web/应用程序服务器中实例化,并在 Servlet 内部使用。 s。

本身 Reflection不是最快的,并且由于我不想在每次实例化具体类型时重复扫描( new ),缓存带注释的 Method 的最佳策略是什么?的。

我实际上正在使用 ConcurrentHashMap<Class<? extends AbstractClass>, List<Method>> ,并且在初始化 block 中我检查 Map 是否已包含最上面的具体类型的条目。

但是我认为这不是最好的处理方法。顺便说一句,我不能有外部依赖项。

最佳答案

如果您使用的是 Java 8,请使用 computeIfAbsent以避免重新计算带有注释的方法集:

private static final ConcurrentMap<Class<?>,List<Method>> METHODS = new ConcurrentHashMap<>();
...
Clazz<?> clazz = getClass();
METHODS.computeIfAbsent(clazz, c -> findMethods(c));
...
private static List<Method> findMethods(Class<?> clazz) {
final List<Method> methods = new ArrayList<>(16);
while (clazz != Object.class) {
for (final Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
methods.add(method);
}
}
clazz = clazz.getSuperclass();
}
return methods;
}

这将缓存每个类的方法,并避免重新计算 List<Method>对于同一个类(class)。

关于java - 反射 - 多个子类的方法缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47816401/

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