首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从外部访问access内部类__OnlyOne

外部访问access内部类__OnlyOne可以通过以下几种方式实现:

  1. 使用Getter方法:在外部类中创建一个公共的Getter方法,以便可以访问内部类的私有成员变量。例如,可以在外部类中创建一个名为getOnlyOneInstance()的方法,返回内部类的实例。
代码语言:txt
复制
public class AccessExample {
    private class __OnlyOne {
        // 私有构造函数
        private __OnlyOne() {
            // 构造函数逻辑
        }
    }

    // Getter方法用于访问内部类实例
    public __OnlyOne getOnlyOneInstance() {
        return new __OnlyOne();
    }
}

使用示例:

代码语言:txt
复制
AccessExample accessExample = new AccessExample();
AccessExample.__OnlyOne onlyOneInstance = accessExample.getOnlyOneInstance();
  1. 反射访问:通过反射机制可以绕过访问限制,直接访问内部类的私有成员变量和方法。可以使用Java的反射API中的getDeclaredField()setAccessible()方法来实现。
代码语言:txt
复制
import java.lang.reflect.Field;

public class AccessExample {
    private class __OnlyOne {
        // 私有构造函数
        private __OnlyOne() {
            // 构造函数逻辑
        }
    }

    // 反射访问内部类的私有成员变量
    public static void main(String[] args) throws Exception {
        AccessExample accessExample = new AccessExample();
        __OnlyOne onlyOneInstance = accessExample.new __OnlyOne();

        // 获取内部类的Class对象
        Class<?> innerClass = onlyOneInstance.getClass();

        // 获取私有成员变量
        Field privateField = innerClass.getDeclaredField("__OnlyOne");

        // 设置访问权限为可访问
        privateField.setAccessible(true);

        // 访问私有成员变量的值
        Object privateFieldValue = privateField.get(onlyOneInstance);
        System.out.println(privateFieldValue);
    }
}

请注意,反射机制可能会破坏封装性,因此在实际开发中应当谨慎使用。

这里介绍了两种常见的方法,可以从外部访问access内部类__OnlyOne。根据具体的使用场景和需求,选择适合的方法进行访问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

灵魂拷问:Java内部类如何访问外部类私有对象的?

编译器小哥偷偷的做了一些不可告人的事情,首先,内部类中多了个常量引用,准备指向着外部类,而且又偷偷修改了构造方法。传递一个OutClass类型的参数进去。这样内部类就拿到了外部类的引用。...这个时候我做了个方法的测试呀,我们都知道,内部类使用外部类的属性用过外部类类名.this.属性名,所以我写了个测试方法fun public void fun(){ System.out.println...看上去看不懂有点复杂,但是没关系我们看右边,看我红色箭头,是不是有点属性, Field this$0:LOutClass; Method OutClass.access$000:(LOutClass;...将指向外部类的引用作为参数给那三个外部类中的静态方法 然后我们去反编译看看那三个静态方法怎么实现的 又是祭出伟大的反编译工具 ? 看得出,这三个方法都是返回外部类对应的私有属性!...结论 在虚拟机中没有外部类部类之分都是普通的类,但是编译器会偷偷的做点修改,让内部类中多一个常量引用指向外部类,自动修改内部类构造器,初始化这个常量引用,而外部类通过扫描内部类调用了外部类的那些私有属性

2.6K10
  • 字节码深刻理解内部类

    (如果 entry 使用内部类,每个 entry 中将会包含一个指向该 Map 的引用,这样就浪费了空间和时间) 思考 内部类如何获取到外部类的属性? 静态内部类没有调用外部类属性时 ?...对于内部类访问外部类的属性: 静态变量 实例变量 不同在于:访问实例变量的时候需要通过外部类的对象来进行访问 那怎么去调用呢?...都会自动生成一个 access 访问方法供内部类进行访问。...非静态内部类的每个实例都隐含着与外部类的一个外部实例相关联。在非静态内部类的实例方法,可以调用外部实例上的方法,或者利用修饰过的 this 构造获得外部实例的引用。...当内部类的对象引用被一直持有时,外部类的对象将不能被垃圾机制回收,从而导致了内存泄漏。 如何正确使用嵌套类呢 如果声明一个嵌套类不要求访问外部类实例,就要使用静态内部类

    89520

    (21) 内部类的本质 计算机程序的思维逻辑

    $0()); } } 内部类访问外部类的一个私有静态变量shared,而我们知道私有变量是不能被类外部访问的,Java的解决方法是,自动为Outer生成了一个非私有访问方法access$0,...在外部类,使用成员内部类与静态内部类是一样的,直接使用即可,如test()方法所示。...在新建Outer$Inner对象时传递当前对象给它,由于内部类访问外部类的私有变量和方法,外部类Outer生成了两个非私有静态方法,access$0用于访问变量a,access$1用于访问方法action...test中,方法内部类只能在定义的方法被使用。...类文件是如何组织的?本节中,自动生成的方法如access$0没有可见性修饰符,那可见性是什么?这些都与包有关,让我们下节来探讨。

    76180

    java面向对象相关知识

    部类可以引用他包含类的成员吗,如果可以,有没有什么限制吗? 一个内部类对象可以访问创建它的外部类对象的内容,内部类如果不是static的,那么它可以访问创建它的外部类对象的所有属性内部类。...如果是sattic的,即为nested class,那么它只可以访问创建它的外部类对象的所有static属性。...一般普通类只有public或package的访问修饰,而内部类可以实现static,protected,private等访问修饰。...当外部类继承的时候,内部类是不会被覆盖的,它们是完全独立的实体,每个都在自己的命名空间内,如果部类中明确地继承,就可以覆盖原来内部类的方法。...而通常的内部类需要在外部类实例化后才能实例化。

    56210

    深入理解Java内部类

    上述代码中,外部类的非静态私有字段age在静态内部类中使不允许访问的,而静态字段name则是可访问的。下面我们看,如何创建一个静态内部类的实例对象。...也就是说,编译器会将一个类编译成一个源文件,对于内部类也是一样,它会它的外部类中抽离出来,增加一些与外部类的联系,然后被编译成一个单独的源文件。...对于Out中所有的私有成员(也就是内部类分离出去之后不能访问的成员),增设了可供调用的access$xxx方法,从而实现内部类外部类之间的联系。这就是他们的本质。...下面我们看看在外部如何创建该内部类实例的。...对于实例的创建,我们只需要记住即可,成员内部类的实例创建需要关联外部类实例对象,静态内部类实例创建相对简单。下面我们主要看看在编译阶段编译器是如何保持内部类外部类成员信息可访问的。

    1.2K80

    Java魔法堂:内部类详解

    相对外部类仅有默认和public两种访问修饰符而言,成员内部类可有默认、private、proteced和public四种访问修饰符,效果与成员字段和方法的一样。  ...当成员内部类拥有与外部类同名的成员变量或方法时,默认是使用成员内部类的成员。若要访问外部类的同名成员,则需要进行如下操作: 外部类.this.成员变量; 外部类.this.成员方法;     2....四、局部内部类                              局部内部类定义在方法或某个作用域里面,并且仅限于方法和该作用域访问。  ...局部内部类中仅能访问方法或作用域的常量,若访问的是变量则编译时会出错。        Q:为什么不能访问局部变量呢?        ...A:假设可以访问局部变量,那么要考虑的是如何引用到局部变量。

    81660

    详解 Java 内部类

    } } 这里的内部类就像外部类声明的一个属性字段一样,因此其的对象时依附于外部类对象而存在的,我们来看一下结果:  我们注意到,内部类对象可以访问外部类对象中所有访问权限的字段,同时,外部类对象也可以通过内部类的对象引用来访问部类中定义的所有访问权限的字段...但是于此同时,静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员...最后看看运行结果:   内部类的嵌套  内部类的嵌套,即为内部类中再定义内部类,这个问题部类的分类角度去考虑比较合适: 普通内部类:在这里我们可以把它看成一个外部类的普通成员方法,在其内部可以定义普通内部类...(同一个包的类可以访问)的字段 field1, 和一个 private 权限的字段 field2 ,并且定义了一个内部类 InnerClassA ,并且在这个内部类中也同样定义了两个和外部类中定义的相同修饰权限的字段...而且因为外部类对象需要访问当前类的私有成员,编译器给这个静态内部类生成了一个名为 access$000 的静态方法,作用已不用我多说了。

    61030

    详解 Java 内部类

    种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。...但是于此同时,静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员...,定义的局部内部类只能在对应定义域使用; 局部内部类:和匿名内部类一样,但是嵌套定义的内部类只能在对应定义域使用。...(同一个包的类可以访问)的字段 field1, 和一个 private 权限的字段 field2 ,并且定义了一个内部类 InnerClassA ,并且在这个内部类中也同样定义了两个和外部类中定义的相同修饰权限的字段...而且因为外部类对象需要访问当前类的私有成员,编译器给这个静态内部类生成了一个名为 access$000 的静态方法,作用已不用我多说了。

    52030

    详解 Java 内部类

    但是于此同时,静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员...最后看看运行结果: 内部类的嵌套 内部类的嵌套,即为内部类中再定义内部类,这个问题部类的分类角度去考虑比较合适: 普通内部类:在这里我们可以把它看成一个外部类的普通成员方法,在其内部可以定义普通内部类...(同一个包的类可以访问)的字段 field1, 和一个 private 权限的字段 field2 ,并且定义了一个内部类 InnerClassA ,并且在这个内部类中也同样定义了两个和外部类中定义的相同修饰权限的字段...,只是在访问上有些不同:外部类无法访问匿名内部类和局部内部类对象的字段,因为外部类根本就不知道匿名内部类 / 局部内部类的类型信息(匿名内部类的类名被隐匿,局部内部类只能在定义域使用)。...而且因为外部类对象需要访问当前类的私有成员,编译器给这个静态内部类生成了一个名为 access000 的静态方法,作用已不用我多说了。

    94810

    Java 基础巩固:内部类的字节码学习和实战使用场景

    的字节码中,编译器为我们生成了一个参数为外部类对象的构造方法,这也解释了内部类为什么可以直接访问外部类的内容,因为持有外部类的引用!...为了帮助内部类访问外部类的数据,编译器会生成这个 access方法,参数是外部类的引用,如果外部类有N个成员,编译器会生成多个access方法, 方法,参数是外部类的引用,如果外部类有 N 个成员,编译器会生成多个...对比内部类的 innerMethod() 的 java 代码和字节码我们可以得出这些结论: 在内部类中,直接使用变量名,会按照方法中的局部变量、到内部类的变量、到外部类的变量的顺序访问 也就是说,如果在外部类...否则只能访问外部类的静态属性和静态方法,同理外部类只能访问部类的静态属性和静态方法。 3.局部内部类 局部内部类是指在代码块或者方法中创建的类。...它和成员内部类的区别就是:局部内部类的作用域只能在其所在的代码块或者方法,在其它地方是无法创建该类的对象。

    1.3K100

    细话Java:”失效”的private修饰符

    一个我们在编程中经常用到的场景,就是在一个内部类里面访问外部类的private成员变量或者方法,这是可以的。如下面的代码实现。...28: invokestatic #39; //Method OuterClass.access$1:(LOuterClass;)Ljava/lang/String; 注意:在内部类构造的时候,会将外部类的引用传递进来...,并且作为内部类的一个属性,所以内部类会持有一个其外部类的引用。...意思是 如果(内部类的)成员和构造方法设定成了私有修饰符,当且仅当其外部类访问时是允许的。...如何让内部类私有成员不被外部访问 相信看完上面两部分,你会觉得,内部类的私有成员想不被外部类访问都很困难吧,谁让编译器“爱管闲事”呢,其实也是可以做到的。那就是使用匿名内部类

    36920

    细话Java:失效的private修饰符

    一个我们在编程中经常用到的场景,就是在一个内部类里面访问外部类的private成员变量或者方法,这是可以的。如下面的代码实现。...,会将外部类的引用传递进来,并且作为内部类的一个属性,所以内部类会持有一个其外部类的引用。...this$0就是内部类持有的外部类引用,通过构造方法传递引用并赋值。...意思是 如果(内部类的)成员和构造方法设定成了私有修饰符,当且仅当其外部类访问时是允许的。...如何让内部类私有成员不被外部访问 相信看完上面两部分,你会觉得,内部类的私有成员想不被外部类访问都很困难吧,谁让编译器“爱管闲事”呢,其实也是可以做到的。那就是使用匿名内部类

    80740

    Java 内部类的意义及应用

    当然,这里的特殊命名规则其实就是:外部类名 + $ + 内部类名。 那么,既然内部类会被单独编译出来,那它如何保持与外部类的联系呢,我们反编译一下字节码文件。 ? ?...由于静态内部类内部只能访问它的外部的静态成员,而对于访问权限可见的情况下,这两个类本质上毫无关联,但如果像我们此例中的外部类属性 name 而言,它本身被修饰为 private,不可见于外部的任何类。...,而你外部越过外围类而单独创建内部类的实现显然是不符合面向对象设计思想的。...如果方法是实例方法,那么方法的内部类可以访问外围类的任意成员,如果方法是静态方法,那么方法内部的内部类只能访问外围类的静态成员。...我们反编译的结果来看,局部内部类中只保存的这些变量的数值,而不是内存地址,并且也不允许更改,那么如果外部的这些变量可更改,将直接导致每个新建内部类的实例具有不同的属性值,所以直接给声明为 final,

    1.1K40

    Java语法糖(二)

    printInner() { //内部类可以访问外部类的属性,即使是私有变量, //如果内部类的成员变量与外部类的成员变量重名,内部类的str会覆盖外部类的...//这就是为什么前文提到的只有先创建外部类实例才能创建成员内部类实例、成员内部类可以随意访问外部类的成员变量和方法。...方法,当startThread方法执行结束后,这两个变量的生命周期就结束了,但另外一个线程中的run方法很可能还没有结束,再去访问paramStr和str变量是不可能的。     ...,不能访问外部类的非静态成员和方法。...如何选择使用哪种内部类?     1、如果成员内部类的每个实例都需要一个指向其外围类的引用,选择非静态成员内部类,否则选择静态成员内部类

    39830

    Java中嵌套类用法

    因此,在上面的例子中,类NestedClass并不独立于类的 OuterClass外部类而存在。 嵌套类可以访问嵌套类的成员,包括私有成员。然而,反之则不然,即封闭类不能访问嵌套类的成员。...2、内部类(inner class):内部类是非静态嵌套类。 Syntax class OuterClass { ......) 要实例化内部类,必须首先实例化外部类。...(非静态嵌套类)的区别: 静态嵌套类不能直接访问封闭类的其他成员(非静态变量和方法),因为由于它是静态的,它必须通过对象访问封闭类的非静态成员。...非静态嵌套类(内部类)可以访问外部类的所有成员(静态和非静态变量和方法,包括private),并且可以像外部类的其他非静态成员那样直接引用它们。

    2.1K40
    领券