【发布时间】:2011-08-26 18:29:53
【问题描述】:
我有一个非常有创意的解决方案,允许我的未签名代码通过我的签名库进行所有访问。虽然不好的做法,但我担心我没有其他解决方案(除了重写很多代码,然后需要重写)。
我有以下课程:
public abstract class full {
public static <T,S,P> S access(final T object, final String function, final P parameter) {
AccessController.doPrivileged(new PrivilegedAction<S>() {
@Override
public S run() {
try {
if (parameter == null) {
Class[] argTypes = { };
Object passedArgv[] = { };
return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
} else {
Class[] argTypes = { parameter.getClass() };
Object passedArgv[] = { parameter };
return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
}
} catch (NoSuchMethodException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
});
return null;
}
}
它适用于返回对象的函数,但不适用于原语。 Boolean bool = full.access(..); 将产生一个空指针,因为泛型方法无法处理原语。
关于如何采取正确方法的任何想法?
测试:
public static Boolean test() {
return true;
}
public Main() {
System.out.println(((Boolean)redirect.full.access(this, "test", null)));
}
【问题讨论】:
-
Boolean类型不是原始类型(这就是它可以为 null 的原因),而是围绕bool的包装类。bool类型是一个原始类型——因此,NPE 位于别处。
标签: java generics methods primitive