Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当类型信息不可用时,如何强制转换到私有内部类?_Java_Class_Reflection_Private - Fatal编程技术网

Java 当类型信息不可用时,如何强制转换到私有内部类?

Java 当类型信息不可用时,如何强制转换到私有内部类?,java,class,reflection,private,Java,Class,Reflection,Private,我的情况与以下类似: // In some library code public class A { private class B { Object value; } } // In my code Object o; // o is initialized to an instance of B somehow // ... B bInstance = (B) o; 如果B类型不可访问,我将如何将对象强制转换为类型B 更详细地解释一下,A不是

我的情况与以下类似:

// In some library code
public class A
{
    private class B
    {
        Object value;
    }
}

// In my code
Object o;

// o is initialized to an instance of B somehow
// ...

B bInstance = (B) o;
如果B类型不可访问,我将如何将对象强制转换为类型B


更详细地解释一下,A不是我的代码库的一部分。它是图书馆的一部分。我可以访问一个我知道是类型B的对象,但是我不能强制转换它(例如在IDE中),因为类型信息不可见。这是一个编译错误。情况非常严峻。我认为使用反射来实现这一点是可能的,但我恐怕没有太多使用这种特殊范式的经验。这有什么办法吗?我非常感谢社区提供的任何意见。

也许你应该使用一个界面来代替?还是说这也是不可能的

我不知道以下内容是否是您所需要的,但也许这可以帮助您找到解决方法(因为您要求使用反射):

既然您有了B实例,您应该尝试:

Class<?> innerClass = o.getClass();
Class innerClass=o.getClass();
然后,如果可能的话,试着通过如下方式使用反射来获得所需:

Field allFields[] = innerClass.getDeclaredFields();    
Constructor<?> constructors[] = innerClass.getDeclaredConstructors();
Method allMethods[] = innerClass.getDeclaredMethods();

constructor.setAccessible(true);  sets the constructor accessible.
Field allFields[]=innerClass.getDeclaredFields();
构造函数[]=innerClass.getDeclaredConstructors();
方法allMethods[]=innerClass.getDeclaredMethods();
constructor.setAccessible(true);设置可访问的构造函数。

您可以自己实例化该实例,还是使用以某种方式返回的实例很重要?

使用私有内部类的一点就是您不希望其他人使用它。你为什么要走这条路?现在的问题是什么?您是否希望在
B
实例上调用某些方法?您可以只使用
toString()
,也可以使用反射通过B的实例调用B中的任意方法。这是正确的。我假设B实现了一些接口,因为您有对它的引用。您试图做什么使接口引用不足?强制转换到B实现的接口。在这种特殊情况下,我可以使用一个公共接口。因为一些我从未想过的原因。非常感谢。