内部类 -access$000 访问私有域

内部类:

package innerClass;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

/**
 * Created by admin on 2017-3-29.
 */
public class InnerClassTest {

    public static void main(String[] args) {
        TalkingClock clock = new TalkingClock(1000,true);
        clock.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }

}
class TalkingClock{
    private int interval;
    private boolean beep;

    public TalkingClock(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }

    public void start(){
        ActionListener listener = new TimePrinter();
        Timer t = new Timer(interval,listener);
        t.start();
    }
class TimePrinter implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(new Date());
        if (beep){
            System.out.println("beep");
        }
    }
}

}

非内部类:

package innerClass;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

/**
 * Created by admin on 2017-3-29.
 */
public class InnerClassTest {

    public static void main(String[] args) {
        TalkingClock clock = new TalkingClock(1000,true);
        clock.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }

}
class TalkingClock{
    private int interval;
    private boolean beep;

    public TalkingClock(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }

    static boolean access$000(TalkingClock talkingClock){
        return talkingClock.beep;
    }
    public void start(){
        ActionListener listener = new TimePrinter(this);
        Timer t = new Timer(interval,listener);
        t.start();
    }

}
class TimePrinter implements ActionListener{

    private TalkingClock outer;

    public TimePrinter(TalkingClock clock) {
        outer = clock;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(new Date());
        if (TalkingClock.access$000(outer)){
            System.out.println("beep");
        }
    }
}

1.内部类可以访问该类定义所在作用域中数据,包括私有。是因为内部类的对象有一个隐式引用,他指向了创建它的外部类对象。外部类的引用在构造器中设置,构造器的参数为外部类引用。
2.内部类一种编译器现象,与虚拟机无关。编译器会把内部类翻译成用$(美元符号)分隔外部类名与内部类名的常规文件。编译器为了引用外部类,会生成一个附加的实例域this$0(名字是有编译器合成的,在自己的代码中不能引用它)。

3.内部类被翻译成名字怪异的常规类,对于域来说,每个域会自动生成一个静态方法access$000(或access$0),该方法接受所属类对象为参数,返回值传给域。可以利用这个在B类中调用A类的私有方法。

时间: 2025-01-07 01:46:20

内部类 -access$000 访问私有域的相关文章

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends

IE安全设置禁止访问其他域数据源

CreateTime--2017年5月28日09:04:25Author:Marydon IE安全设置禁止访问其他域数据源的解决方法 工具-->Internet选项-->安全-->自定义级别-->找到“通过域访问数据源”-->选择“启用”.

c++访问私有(private)成员变量的常用方法

类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的. 在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,这样编译器会阻止任何来自外部非友元的直接访问. 私有成员变量的常用访问方法如下: (1)通过公共函数为私有成员赋值 #include <iostream> using namespace std; class Test { private: int x, y; public: void setX(int a) { x=a; } voi

php 对象直接访问私有属性

<?php header("content-type:text/html;charset=UTF-8"); class Person{ //私有的成员属性,对直接访问象 private $name; private $age; private $sex; //魔术方法 __construct(), __set(), __unset(), __isset(), __unset()..... function __construct($name="name1",$

在赋值运算符函数中,类的实例能直接访问私有数据成员???

印象中,private的数据成员只能在类的成员函数中使用,无法通过类的对象直接访问!(错误理解) 正确的理解是:在类的成员函数中,可以直接访问私有成员.即只要在该类的成员函数中,无论是直接访问该类的私有数据成员,还是访问某个对象(必选是该类型)的私有数据成员,均是可以的!!! 借鉴网上(http://blog.csdn.net/iaccepted/article/details/34853937 )的说法就是: 实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(ins

如何访问私有方法

# -*- coding: utf-8 -*- #python 27 #xiaodeng #如何访问私有方法 class Securityp(object): def __my(self): print "Bet you can't see me..." b=Securityp() print dir(b) #打印出所有的方法和属性等信息 print b.__dict__ #没有打印结果 b._Securityp__my() ''' ['_Securityp__my', '__clas

.net 反射访问私有变量和私有方法

以下为本次实践代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Linq; 5 using System.Reflection; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace ConsoleTest 10 { 11 class Program 12 { 13

用ldap方式访问AD域的的错误解释

在配置OTRS时遇到的问题,查到以下信息,以便查询. python-ldap访问AD域的的错误一般会如下格式:{'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 525, vece', 'desc': 'Invalid credentials'}其中代码部分的意思如下(这些错误码跟语言无关):525 - 用户没有找到52e - 证书不正确530 - not permitted

JavaSE7基础 借助公有的成员方法 访问私有的成员方法

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Test{ //私有的成员方法,类外不可以直接访问 private void hello(){ System.out.println("hello"); } //借助公有的成员方法 访问私有的成员方法 public void sayHello(){ hello(); } } class Demo{ public static void main(String[] arg