我有以下课程:

interface Ivisitor{

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


访客实现此接口:

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


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

09-11 20:29