Доступ к переменной пути в FileInputStream с использованием отражения

Я наткнулся на код, который использует отражение, чтобы добраться до переменной «путь» в FileInputStream!! Более странным является то, что commons.lang.reflect.FieldUtils.readField(is, "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;
         }
    }

person user2023507    schedule 28.04.2015    source источник
comment
Зачем вам нужен путь к FileInputStream? Согласно следующему источнику, FileInputSteam не содержит поля path, а readField вызовет исключение IllegalArgumentException, если `если ... имя поля пусто или пусто или не может быть найдено`: docjar.com/html/api/java/io/FileInputStream.java.html< /а>   -  person copeg    schedule 29.04.2015
comment
Я смотрю на версию java.io.FileInputStream 1.7.0_60_64, и она имеет следующее: частный окончательный путь строки; Похоже, имя файла извлекается из переменной пути и используется ниже по течению. Все еще работаю над частью каскадного API, чтобы понять, почему так должно быть!   -  person user2023507    schedule 29.04.2015
comment
Опять же, зачем вам путь? Рефлексия кажется шатким способом сделать это.   -  person copeg    schedule 29.04.2015
comment
Не заинтересованы в альтернативных решениях более крупной проблемы. Просто любопытно, почему отражение не сможет увидеть поле в этом случае. Я все равно проведу рефакторинг исходного кода, чтобы избежать этой ошибки. Хотите знать, существует ли способ исправить это вместо этого. Спасибо!   -  person user2023507    schedule 29.04.2015


Ответы (1)


Вы должны использовать пользователя FieldUtils.readDeclaredField(...), чтобы получить доступ к закрытым полям.

person dmitrievanthony    schedule 28.04.2015
comment
Нет. readDeclaredField учитывает только целевой класс, тогда как readField также учитывает родительские классы. Не имеет ничего общего с частным/общедоступным доступом. - person user2023507; 29.04.2015