Java 使用反射在FileInputStream中访问路径变量

Java 使用反射在FileInputStream中访问路径变量,java,reflection,io,cascading,Java,Reflection,Io,Cascading,我遇到了一些使用反射来获取FileInputStream中的“path”变量的代码!!更奇怪的是commons.lang.reflect.FieldUtils.readField(即“path”,true)抛出了一个java.lang.IllegalArgumentException。那太断断续续了。。。可能是某些特定的场景导致了这一点,但我无法理解。关于什么可能导致反射无法“看到”字段的任何指针 代码隐藏在大量与层叠工作流相关的混乱中,但以下是相关部分- //This same method

我遇到了一些使用反射来获取FileInputStream中的“path”变量的代码!!更奇怪的是
commons.lang.reflect.FieldUtils.readField(即“path”,true)
抛出了一个
java.lang.IllegalArgumentException
。那太断断续续了。。。可能是某些特定的场景导致了这一点,但我无法理解。关于什么可能导致反射无法“看到”字段的任何指针

代码隐藏在大量与层叠工作流相关的混乱中,但以下是相关部分-

//This same method is invoked multiple times on same file. If it matters?
    method(SourceCall<Object, InputStream> sc) {
        InputStream is = sc.getInput();
        if (is instanceof FileInputStream) {
             FileInputStream fileInputStream = (FileInputStream)is;
             //The line below throws IllegalArgumentException - sometimes
             String fileName = (String)FieldUtils.readField(fileInputStream , "path", true);
             return fileName;
         }
    }
//在同一个文件上多次调用此方法。如果重要的话?
方法(SourceCall sc){
InputStream=sc.getInput();
if(是FileInputStream的实例){
FileInputStream FileInputStream=(FileInputStream)为;
//下面的行抛出IllegalArgumentException-有时
字符串文件名=(字符串)FieldUtils.readField(fileInputStream,“path”,true);
返回文件名;
}
}

您应该使用
FieldUtils.readDeclaredField(…)
来访问私有字段。

为什么需要FileInputStream的路径?根据以下来源,FileInputSteam不包含路径字段,如果“如果……字段名为空或找不到”,readField将抛出IllegalArgumentException:我正在查看java.io.FileInputStream的1.7.0_60_64版本,它具有以下私有最终字符串路径;看起来文件名是从path变量中提取出来并在下游使用的。仍在研究级联API部分,以了解为什么必须采用这种方式!再说一遍,你为什么需要这条路?反思似乎是一种不稳定的方式。对更大问题的替代解决方案不感兴趣。只是好奇为什么反射在这种情况下看不到场。我将重构原始代码以避免此错误。我想知道是否有办法解决它。谢谢事实证明,这是建筑工程中竹子的一个问题。它正在将java版本1.7.0_21而不是1.7.0_51设置为java.home maven环境变量,并且FileInputStream在版本1.7.0_21中没有“path”变量。。!要了解关于发布插件&java.home的更多信息,请参阅No.readDeclaredField只考虑目标类,而readField也考虑父类。与私人/公共访问无关。