调用私有内部类方法

调用私有内部类方法

请问老师,怎么去调用私有内部类方法?可以举个例子吗?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,同学描述的是访问私有内部类中的私有方法吗?如果是,则在 Java 中私有内部类中的私有方法无法直接从外部类进行访问。但可以通过以下方式来间接调用私有内部类方法:

1、通过公共接口或公共方法调用,可以创建一个公共接口或公共方法,然后在内部类中实现该接口或方法。外部类可以通过创建内部类的实例并调用公共接口或方法来间接调用私有方法。案例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class OuterClass {
    // 私有内部类
    private class InnerClass {
        private void privateMethod() {
           System.out.println("私有方法");
        }
         
        public void publicMethod() {      
            System.out.println("公共方法");
            this.privateMethod(); // 调用私有方法
        }
    }
     
    public void callPrivateMethod() {
        // 通过InnerClass 的实例调用公共方法 publicMethod() 间接调用私有方法 privateMethod()。
        InnerClass inner = new InnerClass();
        inner.privateMethod(); // 间接调用私有方法
    }
}

2、通过反射机制调用,反射机制允许在运行时检查和操作类和方法。可以使用反射机制创建内部类的实例,并调用其私有方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
 
public class OuterClass {
    // 私有内部类
    private static class InnerClass {
        // 私有方法 
        private void privateMethod() {
            System.out.println("私有方法");
        }
    }
     
    public void callPrivateMethod() {
        try {
            Class<?> innerClass = Class.forName("OuterClass$InnerClass"); // 获取内部类 Class 对象
            Constructor<?> innerConstructor = innerClass.getDeclaredConstructor(); // 获取内部类构造方法
            innerConstructor.setAccessible(true); // 设置构造方法为可访问
            Object innerInstance = innerConstructor.newInstance(); // 创建内部类实例
            Method privateMethod = innerClass.getDeclaredMethod("privateMethod"); // 获取私有方法
            privateMethod.setAccessible(true); // 设置私有方法为可访问
            privateMethod.invoke(innerInstance); // 调用私有方法
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

祝学习愉快!

  • 停停停呀 提问者 #1

    可是老师,我这在eclipse用junit测试发现报错,怎么回事?

    https://img1.sycdn.imooc.com/climg/654b84b209346f8c10980858.jpg

    2023-11-08 20:53:16
  • 好帮手慕小尤 回复 提问者 停停停呀 #2

    同学你好,之前老师案例是获取静态内部类(静态内部类可以不依赖外部类,通过上方案例进行实现),如果是非静态无法获取到内部类。同学可以尝试下方案例,基于外部类去找内部类(非静态内部类,需要依赖微外部类)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.imooc.test;
     
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
     
    public class Test {
        public static void main(String[] args) throws Exception {
            //获取外部类的类对象
            Class<?> clazz = OuterClass.class;
            //获取外部类构造方法
            Constructor<?> outter = clazz.getDeclaredConstructor();
            //创建外部类实例,为构建内部类对象做准备
            Object out = outter.newInstance();
            //获取外部类中所有的内部类
            Class<?>[] classes = clazz.getDeclaredClasses();
            //由于只有一个内部类,所以直接去下标0的内部类
            Class<?> inner = classes[0];
            //获取内部类的所有构造方法
            Constructor<?>[] constructors = inner.getDeclaredConstructors();
            //由于只有一个构造方法,所以直接去下标0的构造方法
            Constructor<?> con = constructors[0];
            //该构造方法默认就是私有的,所以需要公开化
            con.setAccessible(true);
            //创建内部类对象。由于是成员内部类,所以构建时需要依赖外部类对象,参数就必须传入外部类对象
            Object instance = con.newInstance(out);
            //获取内部类中私有方法
            Method method = inner.getDeclaredMethod("privateMethod");
            //将方法公开化
            method.setAccessible(true);
            //利用内部类对象调用私有方法
            method.invoke(instance);
        }
    }
     
    class OuterClass {
        // 私有内部类
        private class InnerClass {
            // 私有方法
            private void privateMethod() {
                System.out.println("私有方法");
            }
        }
    }

    祝学习愉快!

    2023-11-09 10:48:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码