我有以下课程:
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
它检查实际参数值的运行时类型,而不是形式参数的声明类型。