Файлы SQLite.Interop.dll не копируются в выходной путь проекта, если этого требует указанный проект

Как было сказано ранее, экземпляры String неизменяемы. StringBuffer и StringBuilder являются изменяемыми и подходят для этой цели, нужно ли вам быть потокобезопасными или нет.

Однако есть способ изменить строку, но я бы никогда не рекомендовал ее, потому что это небезопасный, ненадежный и его можно считать обманом: вы можете использовать отражение для изменения внутреннего массива char, содержащего объект String. Reflection позволяет вам получать доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).

public static void main(String[] args) {
    String text = "This is a test";
    try {
        //String.value is the array of char (char[])
        //that contains the text of the String
        Field valueField = String.class.getDeclaredField("value");
        //String.value is a private variable so it must be set as accessible 
        //to read and/or to modify its value
        valueField.setAccessible(true);
        //now we get the array the String instance is actually using
        char[] value = (char[])valueField.get(text);
        //The 13rd character is the "s" of the word "Test"
        value[12]='x';
        //We display the string which should be "This is a text"
        System.out.println(text);
    } catch (NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

13
задан BenCamps 18 September 2015 в 06:43
поделиться