gpt4 book ai didi

java - 动态代理和方法注解

转载 作者:行者123 更新时间:2023-12-01 14:57:41 24 4
gpt4 key购买 nike

我有以下类(class):

interface Ivisitor{

@deduceStrategy("...")
void visit(Icosmos c);
}

访问者实现此接口(interface):

class Visitor implements Ivisitor{
@deduceStrategy("...")
public void visit(Icosmos c)
{
....
}
}

动态代理:

public class strategyLoader{
public static <T> T create(Class<T> clazz,Object wrap) {
T object = (T) Proxy.newProxyInstance(strategyLoader.class.getClassLoader(), new Class[] { clazz },new Handler(wrap));
return object;

}
}

处理程序类的相关部分:

public class Handler implements InvocationHandler {
Object obj;
public Handler(Object obj) {
this.obj = obj;
}

public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
if (m.isAnnotationPresent(deduceStrategy.class)) {
Class[] parameterTypes = m.getParameterTypes();
if((parameterTypes.length==1)&&(**Icosmos.class.isInstance(parameterTypes[0])**))
{
........
}

我需要根据传入 Visitor.visit 的 Icosmos 的确切类型加载适当的策略。然而,参数[0]永远不会解析为Icosmos的实例。如果有人告诉我出路,我将不胜感激。客户端调用访问者为:

Ivisitor visitor = strategyLoader.create(Ivisitor.class,Visitor.class.newInstance());

最佳答案

Icosmos.class.isInstance(parameterTypes[0])

parameterTypes[0] instanceof Icosmos 完全相同,并检查对象 parameterTypes[0] 是否是 Icosmos 的实例(它不是 - 它是一个 java.lang.Class)。

对于您真正需要的东西,有两种可能性。其中之一是

Icosmos.class.isAssignableFrom(parameterTypes[0])

它检查类parameterTypes[0]是否与Icosmos赋值兼容,即给定一个x,它是由 parameterTypes[0] 表示的类,将

Icosmos foo = x;

无需强制转换即可合法。这将检查第一个形参的声明类型是否与Icosmos兼容。

第二种选择是

args[0] instanceof Icosmos

它检查实际参数值的运行时类型,而不是形式参数的声明类型。

关于java - 动态代理和方法注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139789/

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