考虑类:
class OnlyIntegerTypeAllowed<T> {
OnlyIntegerTypeAllowed(Class<T> clazz) {
System.out.println(clazz);
if (clazz != Integer.class)
throw new RuntimeException();
}
}
它旨在仅接受Integer
. 我们if-throw
在其构造函数中添加了一个检查。这是检查类型参数的一种非常常见的方法。
但是,可以通过以下方式绕过(黑客攻击、愚弄)此检查:
OnlyIntegerTypeAllowed<Integer> normalWay =
new OnlyIntegerTypeAllowed<Integer>(Integer.class);
OnlyIntegerTypeAllowed<String> hacking =
new OnlyIntegerTypeAllowed<String>((Class<String>) Class.forName(Integer.class.getName()));
上面两行都没有编译错误,也没有抛出异常!
OMG - 有更好的方法来执行类型参数吗?