`

如何彻底杜绝别人使用你的类

阅读更多

 今天在eclipse源码中发现了这个东东:

写道
transactionLock.new Access() {/*empty block*/}.transfer(owner);
[org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl 814行]transactionLock是Lock类的一个实例

 
 第一眼看上去相当诡异,用了很多的语法特性(内部类在外部实例化的方法,内部类的使用,抽象类等),顺便跟了进去,发现作者的真正用意:
 让我们先看看Lock的代码吧:
 代码大体如下:

class Lock{
     public abstract class Access {
  /**
   * Initializes me.
   */
  protected Access() {
   checkSubclass();
  }
  
  /**
   * Transfers the lock's ownership to the specified thread.
   * 
   * @param thread the new owner thread
   */
  public void transfer(Thread thread) {
   Lock.this. transfer(thread);
  }
  
  private void checkSubclass() {
   String name = getClass().getName();
   String packageName = name.substring(0, name.lastIndexOf('.') + 1);
   
   if (!"org.eclipse.emf.transaction.impl.".equals(packageName)) { //$NON-NLS-1$
    throw new IllegalArgumentException("Illegal subclass"); //$NON-NLS-1$
   }
  }
 }
 //other methods,properties,inner class code 
 }

 
 我们可以看到这个类里面的内部类Access是抽象类,但是没有抽象方法,这就相当诡异了。这个abstract有什么用呢?
 通过abstract之后其他人就不可以直接实例化这个类了。当然可以通过private类或者构造函数来达到这个效果
 ,但自己在别的地方就用不了这个类了。另外我们可以看到在构造函数中调用了checkSubclass方法,我们发现在这个包里检查子类的包名是不是org.eclipse.emf.transaction.impl,否则就抛出异常,从而限制只有这个包的类才能子类化
 这个类了。这样彻底杜绝了别人使用这个类的可能了:
1、把类定义成抽象的,杜绝别人直接实例化
2、在构造函数判断该子类的包是否和Access一个包

1
0
分享到:
评论
4 楼 fuliang 2009-08-04  
yzj520hyy 写道
我觉得这段代码这样做并不是为了杜绝别人使用你的类,如果杜绝的话定义为final不就完了。
但如果写成final以后,这些类给别人去使用,如果别人发现不合适,就无法通过继承的方式来进行修正,而如果让别人继承,别人不使用相同包名的话会导致一些相关资源无法使用的问题,这样的问题在SWT里很多。
所以这些类可以被继承,但是要求与父类在同一包下。

使用final自己就不可以继承扩展它了。我说的是为了杜绝别人去使用它,但是自己在同一个包可以使用它,swt的大多数组件都是这么设计的,为了安全或者避免误用而不让你继承它。
当然你取了一个和它一样的包名可以继承它,这显然不是它所推荐的,它的意图是你不要继承它,而不是你所说的因为不能使用包内相关的资源而故意设计成让你必须使用这个包名才能去继承它的。事实上为了使用某个包内的资源而取其包名和它一致,这显然不是被推荐的方式,并且class code会有安全验证同一个包内的class签名不一致而无法运行。
3 楼 yzj520hyy 2009-08-03  
我觉得这段代码这样做并不是为了杜绝别人使用你的类,如果杜绝的话定义为final不就完了。
但如果写成final以后,这些类给别人去使用,如果别人发现不合适,就无法通过继承的方式来进行修正,而如果让别人继承,别人不使用相同包名的话会导致一些相关资源无法使用的问题,这样的问题在SWT里很多。
所以这些类可以被继承,但是要求与父类在同一包下。
2 楼 flyinglife 2008-07-31  
相当有学问
1 楼 fuliang 2008-05-26  
引用
在构造函数判断该子类的包是否和Access一个包

这个东东又叫做soft final

相关推荐

    IP隐藏网神之网络隐形衣

    网神之网络隐形衣就是网络中的隐形衣。它能够在不改变任何硬件连接配置的情况下,将计算机在网络中隐藏起来,真正实现”隐于无形”...总之,网络隐形衣能够彻底杜绝您上网的后顾之忧,让您尽情享受网络冲浪带来的乐趣!

    数据装甲,保护你的数据安全

    *数据加密 对数据进行加密是数据安全保护的经典方式,KDSEC为您提供了全新的软件数据透明加密,杜绝文件丢失后产生的泄密风险。...如果你很重视自己的个人隐私数据安全,那使用这款专业的数据装甲

    游戏拦截专家2011

    游戏防沉迷专家同时也是一款专业的网瘾戒除软件,按照人体生物规律,采用多种独特技术从源头和习惯上彻底杜绝游戏,配合游戏拦截专家可以有效的控制、降低、直至戒除网瘾。 游戏防沉迷专家操作简单,您最少只要单击...

    网络病毒的防范的基本常识

    一般人都以为不要使用别人的磁盘,即可防毒,但是不要随便用别人的电脑也是非常重要的,否则有可能带一大堆病毒回家。  4、准备一份具有查毒、防毒、解毒及重要功能的软件,将有助于杜绝病毒。 5、使用新软件时,先...

    枫音影院2006仿帝王_sp2

    十二、Helix Server服务器管理,可设定规定的时间内让影片自动更换路径,彻底杜绝盗链,方便查询与操作Helix Server的会员点播日志,使服务器资源有如铜墙铁壁,坚不可催。 十三、会员卡功能,后台生成点卡、包月...

    拓网长微博系统 v1.0.rar

    整站所有文章(标题、简介、内容)均采用图片形式输出,彻底杜绝文章盗链、采集及防止搜索引擎的抓取,让您的更加和谐! 拓网长微博系统特点: 1、用户无需注册,即可拥有所有前台功能; 2、支持自定义字体种类...

    网趣网上购物系统时尚版V13.0

    杜绝辛苦添加的数据轻易被别人复制!  四二、网站商品搜索关键词登记,方便查询哪些商品更容易吸引客户!  四三、导航条魔幻菜单功能,支持文字式和图片式自由选择效果!  四四、支持商品复制功能,可以快速添加或...

    网络安全手册.docx

    等可移动储存介质o 一般 人都以为不要使用别人的磁盘,即可防毒,但是不要随便用别人的电脑也是非常重要的, 否则有可能带一大堆病毒回家。 6、 使用新软件时,先用扫毒程序检査,可减少中毒机会。主动检査,可以过滤...

    网趣网上购物系统的部分特点与精华

    杜绝辛苦添加的数据轻易被别人复制!  四二、网站商品搜索关键词登记,方便查询哪些商品更容易吸引客户!  四三、导航条魔幻菜单功能,支持文字式和图片式自由选择效果!  四四、支持商品复制功能,可以快速添加或...

    路由器如何禁止别人蹭网

    无线路由器本来网速不好(你懂得),还老是被人家蹭网,改密码已经不不能治本了,第一人家问也不好意思,干脆屏蔽它有了密码他也上不了;第二彻底杜绝破解软件来蹭网。来看如何实现

    心理调节培训《压力管理探微》PPT

    二是与朋友们交换一下近况,你会发现,自己那点事算啥,可能别人的烦恼比你大多了,从而自己也就觉得没有什么了。 ... 四、组织压力管理概述 改善工作安排设计: 很多压力问题表面上看是员工感到压力问题,但实际上...

Global site tag (gtag.js) - Google Analytics