Изменение / установка строки, возвращенной из метода доступа - PullRequest
0 голосов
/ 18 июля 2011

Я использую определенный API, у которого есть метод "getName ()".getName () возвращает строку.Можно ли изменить эту строку?В API нет метода-модификатора, а возвращаемые String getName () являются закрытыми.Я не могу изменить API.

Ответы [ 5 ]

3 голосов
/ 18 июля 2011

Нет.Строки неизменны.Если в API нет сеттера, вы не можете изменить содержимое name.

1 голос
/ 18 июля 2011

Строки являются неизменяемыми в языке Java, что означает, что невозможно изменить любой объект String. (Все методы String, которые появляются для изменения строки, такие как concat и append, действительно просто создают и возвращают новый String и оставляют старый без изменений.)

Если вам нужно изменить String локально, вы можете просто использовать конкатенации или замены в вашем локальном справочнике. Если вам нужно изменить String, который вернется getName(), боюсь, вам не повезло.

0 голосов
/ 18 июля 2011

Вопреки распространенному мнению, возможно изменить содержимое объекта String в версиях JDK 1.5 и новее, но я (и, вероятно, все остальные здесь) настоятельно рекомендую его по многим причинам.Строки никогда не предназначались для изменения, и они просто не созданы для этого, что означает, что любая попытка сделать это быстро станет довольно грязной.Тем не менее, если вам это нужно в качестве абсолютного последнего средства, иначе мир может покончить с чем-то вроде этого, вот простой способ сделать это:

public static void main(String[] args) throws Exception {
    String foo = "foo";
    System.out.println("foo's hash value: " + foo.hashCode());
    Field stringValueField = String.class.getDeclaredField("value");
    stringValueField.setAccessible(true);
    stringValueField.set(foo, "bar".toCharArray());
    Field stringHashField = String.class.getDeclaredField("hash");
    stringHashField.setAccessible(true);
    stringHashField.set(foo, 0);
    System.out.println("foo's new value: " + foo);
    System.out.println("foo's new hash value: " + foo.hashCode());
}

Тем не менее, обратите внимание надругие поля в строке: смещение и количество.Вам также придется иметь дело с этими полями, в зависимости от того, как вы измените значение String.Наконец, и, возможно, самое главное, вы должны подумать о том, что произойдет, если вы измените внутреннюю строку .

0 голосов
/ 18 июля 2011

Возможно, getName () возвращает значение поля с именем name. В этом случае вы можете изменить его, используя отражения.

0 голосов
/ 18 июля 2011

Относительно вашего кода везде, где вы хотите использовать X.getName () из определенного API, вы можете использовать прокси-класс Y, который использует X.getName (), чтобы сделать все ваши изменения в Y.getName ().Это легко сделать, если однажды изменится конкретный API (вам нужно всего лишь изменить одно место).

Чтобы изменить поведение X.getName () в конкретном API, вы можете использовать некоторые манипуляции с байт-кодом (например, http://www.csg.is.titech.ac.jp/~chiba/javassist/) во время выполнения.Но это должно быть абсолютным последним ресурсом.

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