Pab*_*lgo 5 java security reflection decorator
在SO处回答了一个问题,我找到了一个解决方案,如果有可能扩展Class类,那将是很好的:
这个解决方案包括尝试修饰Class类,以便只允许包含某些值,在本例中,是扩展具体类的类C.
public class CextenderClass extends Class
{
public CextenderClass (Class c) throws Exception
{
if(!C.class.isAssignableFrom(c)) //Check whether is `C` sub-class
throw new Exception("The given class is not extending C");
value = c;
}
private Class value;
... Here, methods delegation ...
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码不是Class最终的,我想知道为什么Class是最终的.我知道它必须与安全有关,但我无法想象延伸Class是危险的情况.你能举一些例子吗?
顺便说一下,我能达到的理想行为的更接近的解决方案是:
public class CextenderClass
{
public CextenderClass(Class c) throws Exception
{
if(!C.class.isAssignableFrom(c)) //Check whether is `C` sub-class
throw new Exception("The given class is not extending C");
value = c;
}
public Class getValue() {
return value;
}
private Class value;
}
Run Code Online (Sandbox Code Playgroud)
但它缺乏透明装饰的美感.
根据Class类中的注释,只有Java虚拟机才能创建Class对象..
如果允许扩展类,那么如果允许您创建自定义Class对象,则会出现问题?.如果是,那么它将破坏上述规则,即只有JVM才能创建类对象.所以,你没有给予这种灵活性.
PS:getClass()只返回已经创建的类对象.它不会返回新的类对象.