Java: возможно ли получить значение по умолчанию для поля без создания экземпляра? - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть класс Java, который я не могу создать напрямую.Мне нужно знать, каково значение по умолчанию одного из его полей.

например,

Class Foo {
  private Bar field = new Bar("baz"); // can I know that field 
                                      // is set to new Bar("baz")?
}

Ответы [ 6 ]

1 голос
/ 20 декабря 2011

Подробности инициализации поля находятся в конструкторе.Вы можете вызвать конструктор, используя отражения, если необходимо (с помощью setAccessible (true)). Если по какой-то причине вы не можете вызвать его, вы можете прочитать байт-код класса, чтобы определить, к чему будет инициализировано каждое поле.(Это фактически то же самое, что вызов конструктора, но у вас есть полный контроль)

1 голос
/ 20 декабря 2011

Если вы не можете создать его экземпляр, вы не можете получить значение одного из его полей.

На самом деле, когда вы думаете об этом, это совершенно бессмысленно. Значение поля (т. Е. Ссылка на объект для конкретного Bar объекта) не существует до тех пор, пока объект Bar не будет создан. И это происходит только тогда, когда создается экземпляр объекта Foo.

Это имело бы больше смысла, если бы field было инициализировано константным выражением Java, но вы не можете сделать это с помощью ссылочного типа (кроме String).


Единственная возможная комната для маневра здесь - это то, что может быть в состоянии создать экземпляр объекта Foo опосредованно или с помощью отражения и setAccessible, чтобы нарушить ограничения видимости Java. Но даже тогда вы получаете field значение конкретного Foo объекта, который вы создали, а не (бессмысленное) значение поля объекта, которого еще не существует.

1 голос
/ 20 декабря 2011

Проще говоря, вы не можете.

Но в то же время, вы можете с некоторыми действительно ужасными взломами.

Вы можете использовать отражение, чтобы создать объект, а затем изменитьпубличное состояние объекта, так что вы можете получить к нему доступ, а затем получить значение для него.Это действительно плохо, но я полагаю, что это возможно.У меня нет готового кода, но я уверен, что в Интернете есть миллиард примеров кода для создания объекта с помощью отражения.

0 голосов
/ 20 декабря 2011

С некоторой (хорошо, много) работой вы можете разобрать байт-код самостоятельно.Для простых классов это не должно быть слишком сложно, но представьте себе такой класс:

public class Foo {
    private Bar field = OtherClass.someStaticMethod();
}

тогда было бы намного сложнее.

0 голосов
/ 20 декабря 2011

Вы можете достичь этого, используя удивительный, но страшный хак, описанный @glowcoder. Тем не менее, я не рекомендую это ради Java и того, кто в конечном итоге будет поддерживать ваш код.

Я предлагаю вам какой-нибудь метод проверки значения по умолчанию. (Старый метод получения / установки) В любом случае, я не понимаю, почему вы не захотите создавать экземпляры. Есть ли какая-то особая причина?

0 голосов
/ 20 декабря 2011

Если я правильно понял, вы могли бы создать метод для возврата значения этого поля следующим образом:

public Bar getBar() {
     return field;
}

Тогда всякий раз, когда вы используете метод getBar (); в вашем коде он вернет текущее значение поля, поля. (Вам, вероятно, следует изменить имя поля)

Таким образом, чтобы получить значение по умолчанию, просто запустите его, прежде чем устанавливать поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...