- 浏览: 176811 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
spzjby:
这。。应该不行吧,在上传的时候文件正在写入,cancel操作要 ...
基于AJAX的文件上传显示进度条实现 -
lomodd:
准备做一个,拿来参考了。
基于AJAX的文件上传显示进度条实现 -
BackMe:
终于找到需要的东西了,学习中! 好东西果断收藏!
Ajax留言本实现 -
benlsoft:
谢谢了,试下先。
VirtualBox 安装ghost版windows XP -
yexin218:
plkong 写道cqllang 写道偶比较关注楼主咋把每张图 ...
最新版easyMule-VeryCD-src v1.1.13编译
有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。
下面我给大家介绍一下synthetic
下面的例子是最常见的synthetic field
class parent
{
public void 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字段。
注意:不支持内部类成员字段 this$0
“内部类字段 this$0 迁移到名为 Enclosing_Instance 的公共只读属性。”
当 Java Language Conversion Assistant 遇到 this$0 字段时,此注释出现在代码编辑器中。在 Visual J++ 中,内部类具有名为 this$0 的匿名公共只读成员字段,该字段引用封闭类。由于在 .NET Framework 中不支持此字段,因此为内部类提供了名为 Enclosing_Instance 的公共只读属性,该属性返回由 Java Language Conversion Assistant 提供的私有成员 EnclosingInstance 的值。
示例
原始的 Visual J++ 代码:
public class Class1 { int i = 0; class Class2 { public Class2() { System.out.println(this$0.i); } } }
等效的 C# 代码:
using System; public class Class1 { internal int i = 0; class Class2 { private void InitBlock(Class1 EnclosingInstance) { this.EnclosingInstance = EnclosingInstance; } private Class1 EnclosingInstance; public Class2(Class1 EnclosingInstance) { InitBlock(EnclosingInstance); //UPGRADE_NOTE: Inner class field this$0 migrates to a public read-only Enclosing_Instance property. System.Console.Out.WriteLine(Enclosing_Instance.i); } public Class1 Enclosing_Instance { get { return EnclosingInstance; } } } }
java中this$0的含义及用法,具体case是这样的:
通过测试工具去探测界面UI上的控件FlatButton实例对象,但是拿到的最终对象是FlatButton的内部类TextButton对象,
所以这里需要从一个内部类的实例拿到所在外部类的实例,this$0这时就派上用处了。
示例方案如下:
//通过工具获取到TextButton实例对象
textButton=getButtonByToolMethod ();
//获取内部类TextButton的一个字段this$0信息
//this$0特指该内部类所在的外部类的引用,不需要手动定义,编译时自动加上
Filed
outerField=textButton.getClass().getDeclaredField("this$0");
//this$0是私有的,提升访问权限
outerField.setAccessible(true);
//拿到该字段上的实例值
FlatButton flatButton=(FlatButton)outerField.get(textButton);
this$0就是内部类所自动保留的一个指向所在外部类的引用。
另外,受到$后的数字0启发,发现原来数字还可以有1,2,3..., 具体可以看如下代码就一清二楚了.
//Outer.java
public class Outer {//this$0
public class FirstInner {//this$1
public class SecondInner {//this$2
public class ThirdInner {
}
}
}
public static void main(String[] args) throws Exception{
//初始化各内外实例
Outer test = new Outer();
FirstInner first = test.new FirstInner();
FirstInner.SecondInner second = first.new SecondInner();
FirstInner.SecondInner.ThirdInner third=second.new
ThirdInner();
//Outer,this$0
Field outerfield =
first.getClass().getDeclaredField("this$0");
outerfield.setAccessible(true);
Object object = outerfield.get(first);
System.out.println(object instanceof Outer);
//FirstInner,this$1
Field firstInnerfied =
second.getClass().getDeclaredField("this$1");
firstInnerfied.setAccessible(true);
object = firstInnerfied.get(second);
System.out.println(object instanceof FirstInner);
//SecondInner,this$2
Field secondInnerfield =
third.getClass().getDeclaredField("this$2");
secondInnerfield.setAccessible(true);
object = secondInnerfield.get(third);
System.out.println(object instanceof FirstInner.SecondInner);
}
}
其实用 Java 反编译工具生成内部类可以更加清楚
public class Outer$FirstInner{//FirstInner内部类有一个带外部类参数的构造子
public Outer$FirstInner(Outer paramOuter) {}
....
}
public class Outer$FirstInner$SecondInner{
public Outer$FirstInner$SecondInner(Outer.FirstInner
paramFirstInner){}
....
}
public class Outer$FirstInner$SecondInner$ThirdInner{
public
Outer$FirstInner$SecondInner$ThirdInner(Outer.FirstInner.SecondInner
paramSecondInner){}
}
可见每个内部类都有一个指向所在最近的外部类的一个引用,只不过该引用不需要手动添加,编译器会负责。
http://blog.csdn.net/fuuckwtu/article/details/6803624
- corejava8.zip (2.5 MB)
- 下载次数: 4
- Core_Java._Volume_I._Fundamentals__8th_Edition_02.zip (3.2 MB)
- 下载次数: 7
- Core_Java._Volume_I._Fundamentals__8th_Edition_01.zip (4 MB)
- 下载次数: 3
- Core_Java._Volume_II._Advanced_Features__8th_Edition.zip (1.9 MB)
- 下载次数: 3
- Core_Java._Volume_II._Advanced_Features__8th_Edition.z01.zip (9 MB)
- 下载次数: 8
- Core_Java._Volume_II._Advanced_Features__8th_Edition.z02.zip (9 MB)
- 下载次数: 7
发表评论
-
java socket
2017-03-19 20:34 516Socket接收字节缓冲区 http://blog.csd ... -
ab test
2015-04-09 23:36 0https://github.com/ysc/APDPla ... -
log4j 最佳配置优化
2015-04-06 21:03 1091<?xml version="1.0&qu ... -
webrenderer
2013-03-12 22:23 909 -
Ant JavaScript 使用
2013-03-04 19:16 754http://ant.apache.org/manual/T ... -
Jenkins插件开发入门 资料收集
2013-01-31 09:44 8022Jenkins插件开发入门 Jenkins的前身是Hu ... -
远程调试CruiseControl 服务器
2012-12-12 00:02 8331. 修改cruisecontrol.bat配置文件 ... -
ererwerwer
2012-09-21 19:19 0http://www.csdn.net/article/201 ... -
Java字节码(.class文件)格式详解((转载)
2012-09-18 23:21 955http://www.blogjava.net/DLevin/ ... -
findbugs 网络收集
2012-11-10 17:13 994[hyddd的FindBugs分析记录][M X O ... -
CruiseControl 和 Tomca集成
2012-09-15 14:49 1164初步开始研究持续集成引擎:CruiseControl(CC), ... -
设计模式-adapter
2012-08-26 15:33 927基本概念 客户:需要调用我们的代码的对象。 ... -
eclipse 启动远程调试
2012-08-03 14:35 0start java -Xdebug -Xrunjdwp:tr ... -
bat 后台运行
2012-06-03 20:43 1198方法一: @echo off if "%1 ... -
自定义限制JTextArea输入的字符数
2012-05-23 22:25 1720import javax.swing.JTextArea ... -
一个l类似 Jlabel 用于自动换行的文本显示组件
2012-05-19 23:43 3387在Swing中Jlabel组件显示长文本不换行,用JtextA ... -
findbugs
2012-04-10 22:48 1349关于findbugs收集的网络资料信息 http:// ... -
Swing UI
2012-02-22 23:46 1015注意代码中的几个部分: 首先是paintComponent方 ... -
eclipse3.7 安装ADT问题
2011-11-17 10:19 3038eclipse3.7 安装ADT问题: Cannot ... -
ubuntu 10.04运行 myeclipse8.5的小问题
2010-06-14 09:31 1559MyEclipse中打开可视化编辑 ...
相关推荐
Java this用法 概述:Java 中的 this 关键字是一种特殊的引用变量,它总是指向当前对象本身。this 关键字可以用来访问当前对象的成员变量、方法和构造方法。在 Java 中,this 关键字有多种用法,本文将详细介绍 ...
在Java编程语言中,`this`关键字是一个非常重要的概念,它代表了当前对象的引用。初学者在学习Java时,理解和掌握`this`关键字的使用是至关重要的,因为它可以帮助我们更好地编写和理解类与对象之间的关系。下面我们...
JAVA this用法详解 在 Java 编程语言中,this 关键字是一个非常重要的概念,它有多种用法,但基本上可以归纳为三种:表示当前对象的引用、表示类的成员变量和在构造方法中引用满足指定参数类型的构造器。下面将详细...
this(name, 0); // 调用带有两个参数的构造器 } MyClass(String name, int age) { this.name = name; this.age = age; } } ``` 4. **作为方法参数** `this`可以作为方法的参数,将当前对象传递给其他...
Java中this内存原理图示
Java 中 this 的使用 在 Java 中,this 是一个非常重要的关键字,它可以用来指代对象自己本身。在 Java 中,this 主要有三种用法:指代当前类的属性、指代当前类的方法和指代当前类的构造函数。 1.this 指代当前类...
在 Java 编程语言中,`this` 关键字是一个非常重要的概念,它用来引用当前对象的实例。本文将深入探讨 `this` 关键字的三种主要用途,并通过实例代码来解析其工作原理。 首先,`this` 关键字的基本含义是引用当前...
在Java编程语言中,`this`关键字是一个非常关键的概念,它代表了当前对象的引用。在不同的上下文中,`this`有不同的用法和含义,但始终指向调用该代码的对象。接下来,我们将深入探讨`this`关键字在Java中的应用。 ...
Java 中 this 与 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象或父类的成员变量或方法的。下面我们将详细地讲解它们的用法和区别。 首先,让我们来看一下 this 关键字。...
在Java编程语言中,`this`关键字是一个非常重要的概念,它在程序的内存管理中扮演着关键角色。本文将深入探讨`this`关键字在Java程序中的应用,以及它如何与内存分配相关联。 首先,`this`关键字在Java中主要表示...
this("未知", 0); // 调用另一个构造函数 } public Student(String name, int age) { this.name = name; this.age = age; } } ``` 3. **作为方法返回值**:可以在方法中返回当前对象的引用,以便链式调用...
78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中的this.zip78.java中...
Java 中的 this 和 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象的成员变量和方法的。下面我们将详细地讨论这两个关键字的用法和区别。 一、基础知识 1. super(参数):...
Java 中 this 与 super 用法 在 Java 中,this 和 super 是两个重要的关键字,它们都是用于访问当前对象或父类中的成员变量或方法的。 this 用法 this 的用法在 Java 中大体可以分为三种: 1. 普通的直接引用 在...
Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...
java中this 与super的详解
this(rollno, name, 0f); // 使用this()调用另一个构造函数 } Student(int rollno, String name, float fee) { this.rollno = rollno; this.name = name; this.fee = fee; } } ``` 4. 作为方法调用的参数:...
this(0, "Default Name"); // 调用带参数的构造函数 } public MyClass(int x, String name) { this.x = x; this.name = name; } } ``` #### 示例代码分析 根据提供的部分代码,我们可以看到`classArea`类中...