使用反射(package java.lang.reflect)扩展另一个包中的另一个内部类的内部类的私有字段?

使用反射(package java.lang.reflect)扩展另一个包中的另一个内部类的内部类的私有字段?,java,reflection,packages,inner-classes,Java,Reflection,Packages,Inner Classes,如何使用反射(package java.lang.reflect)访问另一个包中的内部类的私有字段,该包扩展了另一个包中的另一个内部类 当Bugativeyron类没有扩展任何内容时(在代码中做了一些更改之后),我将其实例化如下: AuxiliaryPackage.TerciaryClass.BugattiVeyron bugattiVeyron = (new AuxiliaryPackage.TerciaryClass()).new BugattiVeyron(); 。。。没

如何使用反射(package java.lang.reflect)访问另一个包中的内部类的私有字段,该包扩展了另一个包中的另一个内部类

当Bugativeyron类没有扩展任何内容时(在代码中做了一些更改之后),我将其实例化如下:

AuxiliaryPackage.TerciaryClass.BugattiVeyron bugattiVeyron = (new
        AuxiliaryPackage.TerciaryClass()).new BugattiVeyron();
。。。没有例外。。。那么,为了把事情做好,我应该在try块中改变什么呢

提前谢谢

编辑1。 我不是故意大喊大叫的。我认为介绍可能会因为文章的长度而丢失。我已经包括了stackTrace。我道歉。这是我的第二个问题

以下是第一个例外(另一个类似):

第17行是: 字段invisibleField1=bugativeyronClass.getDeclaredField(“最高速度”)

编辑2。 我知道它看起来不像一个“好的编程模式”。这是关于java.lang.reflect限制的研究

编辑3:答案。
我要感谢所有那些对我和蔼可亲、耐心并试图提供答案的人。最后,我从中得到了解决方案。所以,自从我发布这个问题以来,我花了大约一个小时才得到答案。一张唱片!自3月1日以来,我的第一个问题一直没有得到任何关注。

getDeclaredField
提供了
类所引用的确切类中的字段。如果该字段未在子类中声明,则不会以这种方式获得它

您可能想改用:

要反射的场由下面的算法确定。设C为该对象表示的类:

  • 如果C声明了一个具有指定名称的公共字段,则该字段就是要反映的字段
  • 如果在上面的步骤1中没有找到字段,则该算法将递归应用于C的每个直接超级接口。直接超级接口将按照声明的顺序进行搜索
  • 如果在上面的步骤1和2中没有找到字段,并且C有一个超类S,则该算法将在S上递归调用。如果C没有超类,则抛出NoSuchFieldException
  • 这个代码有效

            Class bugattiVeyronClass = bugattiVeyron.getClass();
            Class sportsCarClass = bugattiVeyronClass.getSuperclass();
            Field invisibleField1 = sportsCarClass.getDeclaredField("topSpeed");
            Field invisibleField2 = sportsCarClass.getDeclaredField("tamperedOdometer");
    
    Bugativeyron类没有这些字段,它们来自超类,必须进行相应的访问

    可以使用以下方法查找类层次结构中的字段:

    private static Field getDeclaredFieldInHierarchy(Class<?> clazz, String fieldName) {
        if (clazz == null) {
            return null;
        }
        try {
            return clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            return getDeclaredFieldInHierarchy(clazz.getSuperclass(), fieldName);
        }
    }
    
    私有静态字段getDeclaredFieldInHierarchy(类clazz,字符串fieldName){
    if(clazz==null){
    返回null;
    }
    试一试{
    返回clazz.getDeclaredField(fieldName);
    }捕获(无此字段例外){
    返回getDeclaredFieldInHierarchy(clazz.getSuperclass(),fieldName);
    }
    }
    

    请考虑另一种方法来解决你的问题。这是一种非常糟糕的风格,只应在绝对必要时使用。

    编辑您的问题并重写它,不要使用大写字母。这里没有必要对任何人大喊大叫。我会说最好的答案是“你不想那样做”。但是如果你真的需要这样做。。。您不应该像那样挤压异常。打印出stacktrace并粘贴到问题中。O.O.P.诸神今天都在哭泣。非常感谢您如此友好的回答。我不得不说,我为“O.O.P.诸神今天在哭泣”之类的事情感到难过。我也尝试过这个方法(我忘了提到它),得到了一个类似的异常。但是方法getField的算法似乎禁止我在这里尝试做什么,所以,也许,答案是不可能做到这一点。我知道这不是好的编程实践。这是为了研究目的。非常感谢您的时间和关心。我会试试看,然后告诉你-汉克斯!谢谢谢谢一切都很顺利。我也感谢你礼貌地为我提供的功能。你让它看起来很简单。你是怎么知道的?我没有读过这本书或教程。这就是答案!!我很高兴能帮助你。所有这些信息都可以在Javadoc中获得(您可以阅读)
            Class bugattiVeyronClass = bugattiVeyron.getClass();
            Class sportsCarClass = bugattiVeyronClass.getSuperclass();
            Field invisibleField1 = sportsCarClass.getDeclaredField("topSpeed");
            Field invisibleField2 = sportsCarClass.getDeclaredField("tamperedOdometer");
    
    private static Field getDeclaredFieldInHierarchy(Class<?> clazz, String fieldName) {
        if (clazz == null) {
            return null;
        }
        try {
            return clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            return getDeclaredFieldInHierarchy(clazz.getSuperclass(), fieldName);
        }
    }