随笔 - 154  文章 - 60  trackbacks - 0
<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

声明:

该blog是为了收集资料,认识朋友,学习、提高技术,所以本blog的内容除非声明,否则一律为转载!!

感谢那些公开自己技术成果的高人们!!!

支持开源,尊重他人的劳动!!

常用链接

留言簿(3)

随笔分类(148)

随笔档案(143)

收藏夹(2)

其他

学习(技术)

观察思考(非技术)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

/*
 有synthetic标记的field和method是class内部使用的,
 正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.
 所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。
 下面我给大家介绍一下 synthetic
 下面的例子是最常见的 synthetic field
*/
class parent{
 public void foo(){
  System.out.println("this is foo");
 }
 
 class inner{
  inner(){
   foo();
  }
 }
}
/*
 非static的inner class里面都会有一个this$0的字段保存它的父对象。编译后的inner class 就像下面这样:

class parent$inner{
 synthetic parent this$0;
 parent$inner(parent this$0){
  this.this$0 = this$0;
  this$0.foo();
 }
}

所有父对象的非私有成员都通过 this$0来访问。

还有许多用到synthetic的地方。比如使用了 assert 关键字的class会有一个
synthetic static boolean $assertionsDisabled 字段
使用了assert的地方
assert condition;
在class里被编译成
if(!$assertionsDisabled && !condition){
 throw new AssertionError();
}

还有,在jvm里,所有class的私有成员都不允许在其他类里访问,包括它的inner class。
在java语言里inner class是可以访问父类的私有成员的。在class里是用如下的方法实现的:

class parent
{
 private int value = 0;
 synthetic static int access$000(parent obj){
  return value;
 }
}

在inner class里通过access$000来访问value字段。

希望通过上面几个例子,大家对synthetic 有所了解。
*/

posted on 2007-10-19 11:07 lk 阅读(831) 评论(0)  编辑  收藏 所属分类: j2se

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问