java - 为什么 `Class` 类是最终类?

标签 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 ...
}

我知道这段代码不起作用,因为 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/

相关文章:

java - jbpm 6.1 中围绕运行时引擎的安全问题?

java - 单元测试时未找到自定义注释

c# - 在 List<T> 中搜索对象的所有公共(public)变量以查找特定字符串

java - Eclipse - 运行在其他机器的 Eclipse 上运行的 Android 应用程序,不会在我的 Eclipse 中运行

java - 在 Java 中使用正则表达式从格式为 01OCT12 14 :26 的字符串中提取日期

java - 从 Android 应用程序通过 TCP 发送数据

c# - 获取应用于此实例的 c# 属性?

java - 最佳实践 : if(foo== false) or if(! foo)

ios - 确定受 Touch ID 保护的钥匙串(keychain)项是否存在?

security - 允许其他用户访问 EC2 实例