SORU
21 HAZİRAN 2012, PERŞEMBE


Değiştirilebilir bir java oluşturun.lang.String

Java Stringler değişmez olduğu biliniyor. Değişmez Dizeler kuruluşundan bu yana java için harika bir yanı vardır. Değişmezliğini tanıdı hızlı erişim ve iyileştirmeler bir sürü sağlar önemli ölçüde daha az hata eğilimli C-stil göre dizeler ve güvenlik modeli uygulamak yardımcı olur.

Olası kesmek kullanmadan değiştirilebilir bir tane oluşturmak için, yani

  • java.lang.refect
  • sun.misc.Unsafe
  • Bootstrap classloader sınıflar
  • JNI (veya JNI gerektirir JNA)

Ama mümkünse sadece düz Java, dize herhangi bir zamanda değiştirilebilir? SoruNasıl?

CEVAP
21 HAZİRAN 2012, PERŞEMBE


java.lang.String Karakter seti ile bir yapıcı oluşturma, CharsetDecoder kendi getiriyor kendi Karakter kümesi, enjekte edebilir. CharsetDecoder decodeLoop yöntemi CharBuffer bir nesne için bir başvuru alır. Bu CharBuffer char sarar[] orijinal String nesnesi. Bu CharsetDecoder bir başvuru olduğundan, altta yatan char değiştirebilirsiniz[] CharBuffer kullanarak, böylece değişken bir Dize var.

public class MutableStringTest {


    // http://stackoverflow.com/questions/11146255/how-to-create-mutable-java-lang-string#11146288
    @Test
    public void testMutableString() throws Exception {
        final String s = createModifiableString();
        System.out.println(s);
        modify(s);
        System.out.println(s);
    }

    private final AtomicReference<CharBuffer> cbRef = new AtomicReference<CharBuffer>();
    private String createModifiableString() {
        Charset charset = new Charset("foo", null) {
            @Override
            public boolean contains(Charset cs) {
                return false;
            }

            @Override
            public CharsetDecoder newDecoder() {
                CharsetDecoder cd = new CharsetDecoder(this, 1.0f, 1.0f) {
                    @Override
                    protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
                        cbRef.set(out);
                        while(in.remaining()>0) {
                            out.append((char)in.get());
                        }
                        return CoderResult.UNDERFLOW;
                    }
                };
                return cd;
            }

            @Override
            public CharsetEncoder newEncoder() {
                return null;
            }
        };
        return new String("abc".getBytes(), charset);
    }
    private void modify(String s) {
        CharBuffer charBuffer = cbRef.get();
        charBuffer.position(0);
        charBuffer.put("xyz");
    }

}

Kod çalışan yazdırır

abc
zzz

Doğru decodeLoop uygulamak için nasıl bilmiyorum () ama şu an umrunda :) bilmiyorum

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUNKER530 - Veteran Community & Combat Footage

    FUNKER530 -

    25 Ocak 2007
  • TitaniumBackup

    TitaniumBack

    10 EYLÜL 2011
  • tychoadragmire

    tychoadragmi

    20 Mart 2006