`
plkong
  • 浏览: 177537 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java this$0

 
阅读更多

有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的含义及用法

(2012-01-19 22:43:33)
标签:

杂谈

分类: java

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

分享到:
评论

相关推荐

    Java this用法

    Java this用法 概述:Java 中的 this 关键字是一种特殊的引用变量,它总是指向当前对象本身。this 关键字可以用来访问当前对象的成员变量、方法和构造方法。在 Java 中,this 关键字有多种用法,本文将详细介绍 ...

    java this关键字的使用

    在Java编程语言中,`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 的使用 在 Java 中,this 是一个非常重要的关键字,它可以用来指代对象自己本身。在 Java 中,this 主要有三种用法:指代当前类的属性、指代当前类的方法和指代当前类的构造函数。 1.this 指代当前类...

    Java中this关键字使用小结

    在 Java 编程语言中,`this` 关键字是一个非常重要的概念,它用来引用当前对象的实例。本文将深入探讨 `this` 关键字的三种主要用途,并通过实例代码来解析其工作原理。 首先,`this` 关键字的基本含义是引用当前...

    java中this\super详解

    ### Java中this与super详解 #### 一、引言 在Java编程语言中,`this`和`super`是两个非常重要的关键字,它们在面向对象编程中扮演着至关重要的角色。`this`关键字用于引用当前对象,而`super`则用于访问父类中的...

    java中的this关键字

    在Java编程语言中,`this`关键字是一个非常关键的概念,它代表了当前对象的引用。在不同的上下文中,`this`有不同的用法和含义,但始终指向调用该代码的对象。接下来,我们将深入探讨`this`关键字在Java中的应用。 ...

    Java中this与super的用法

    Java 中 this 与 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象或父类的成员变量或方法的。下面我们将详细地讲解它们的用法和区别。 首先,让我们来看一下 this 关键字。...

    java中带有this关键字的程序内存分析

    在Java编程语言中,`this`关键字是一个非常重要的概念,它在程序的内存管理中扮演着关键角色。本文将深入探讨`this`关键字在Java程序中的应用,以及它如何与内存分配相关联。 首先,`this`关键字在Java中主要表示...

    java中this和supper的详细区分

    this("未知", 0); // 调用另一个构造函数 } public Student(String name, int age) { this.name = name; this.age = age; } } ``` 3. **作为方法返回值**:可以在方法中返回当前对象的引用,以便链式调用...

    78.java中的this.zip

    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 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象的成员变量和方法的。下面我们将详细地讨论这两个关键字的用法和区别。 一、基础知识 1. super(参数):...

    java中this与super用法

    Java 中 this 与 super 用法 在 Java 中,this 和 super 是两个重要的关键字,它们都是用于访问当前对象或父类中的成员变量或方法的。 this 用法 this 的用法在 Java 中大体可以分为三种: 1. 普通的直接引用 在...

    Java中this与super的区别

    Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...

    java中this 与super的详解

    java中this 与super的详解

    【Java编程教程】详解Java this 关键字.pdf

    this(rollno, name, 0f); // 使用this()调用另一个构造函数 } Student(int rollno, String name, float fee) { this.rollno = rollno; this.name = name; this.fee = fee; } } ``` 4. 作为方法调用的参数:...

    java语言this的使用

    this(0, "Default Name"); // 调用带参数的构造函数 } public MyClass(int x, String name) { this.x = x; this.name = name; } } ``` #### 示例代码分析 根据提供的部分代码,我们可以看到`classArea`类中...

Global site tag (gtag.js) - Google Analytics