在运行时更改为标记界面

时间:2015-04-22 16:49:23

标签: java

今天我看到了下一个代码:

public Tab addTab(Component c, String caption, Resource icon, int position) {
    Tab addedTab = super.addTab(c, i18nCaption, icon, position);
    // if is not securized
    if (!(addedTab instanceof SecurizedComponent)) {
        addedTab = SecurityWrapper.createSecurityWrapper((TabSheetTabImpl)addedTab, caption);
    }
    return addedTab;
}

SecurizedComponent是一个标记接口

/**
 * 
 * This is a marker interface. All securized components will be changed at runtime to implement this interface.
 * This way, is possible to know if a component has been securized asking for component instanceof SecurizedComponent
 * 
 * Allows the framework not to securize components more than once
 * 
 */
   public interface SecurizedComponent {

   }

createSecurityWrapper方法可以执行以下操作:

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(wrapperClass);
    enhancer.setClassLoader(source.getClass().getClassLoader());
    enhancer.setInterfaces(new Class[]{SecurizedComponent.class});

    //more stuff...

我知道这段代码在做什么,基本上第一次添加一个标签时,它会在运行时更改以实现SecurizedComponent接口。 但我的问题是:这是一个好习惯吗?有没有更好的方法来实现它?

1 个答案:

答案 0 :(得分:0)

这真的不会让我感到震惊。我会将检查if (!(addedTab instanceof SecurizedComponent)) {放在SecurityWrapper中,因此您无法在代码中的任何位置进行检查,并且使用安全对象调用SecurityWrapper将不会执行任何操作。

否则,我会使用带有isSecured()方法的Securizable接口,所有实现都将返回false,直到SecurityWrapper发挥其魔力。

当然"安全"只有你的代码安全,因为我支持你可以改变你的类来实现Securized并绕过检查......