在 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 ...
}
我知道这段代码不起作用,因为 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;
}
但缺乏透明装饰的美感。
最佳答案
根据Class类中的注释只有Java虚拟机创建Class 对象。。
如果您被允许扩展类,那么就会出现一个问题,您是否应该被允许创建自定义类对象?。如果是,那么它将打破上述只有 JVM 应该创建类对象的规则。因此,您没有这种灵 active 。
PS:getClass()
只返回已经创建的类对象。它不返回新类对象。
关于java - 为什么 `Class` 类是最终类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995566/