Sadece void degitir() metodunun içinde işlem yapmak şartıyla String(x) = "Ahmet" olan değeri nasıl değiştirebilirim ?

static void degitir(String s){
    //sadece burada işlem yapılabilir
}

public static void main(String[] args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    String X = "ahmet";
    System.out.println("X = " + X);
    degitir(X);
    System.out.println("X = " + X);
}

soruldu: 15 Eyl '14, 10:19

tugba's gravatar image

tugba
126141
cevap kabul oranı: 100%

değiştirildi: 16 Eyl '14, 04:18

myururdurmaz's gravatar image

myururdurmaz
2.2k11027

tamam çok teşekkürler..

(15 Eyl '14, 16:13) tugba tugba's gravatar image

Çözümü bu şekilde :

static void degitir(String s){
    try{
        java.lang.reflect.Field field = String.class.getDeclaredField("value");  
        field.setAccessible(true);

        char[] value = (char[])field.get(s);
        value[0] = 'J';  
        value[1] = 'a';  
        value[2] = 'v';  
        value[3] = 'a';  
        value[4] = '!';

    }catch(Exception e){
        // Add message.
    }
}

public static void main(String[] args){

    String X = "ahmet";
    System.out.println("X = " + X);
    degitir(X);
    System.out.println("X = " + X);
}
permanent link

cevaplandı: 16 Eyl '14, 09:49

tugba's gravatar image

tugba
126141
cevap kabul oranı: 100%

değiştirildi: 16 Eyl '14, 09:55

myururdurmaz's gravatar image

myururdurmaz
2.2k11027

Cevap cok güzel ancak bu isin tam gercegi degil maalesef.

@özcanacar hocamizin dedigi gibi bu mümkün degil.

Reflection üzerinden degistirme imkani mevcut, ancak verilmis cevapta, value nun degerini artirmak mümkün degil.

Böyle degistridiginiz zaman, istenmedik yan etikler de oluyor.

Bunun nedenini nedir acaba, sizce?

public static void main(String[] args){

    String X = "ahmet";
    String Y = "ahmet";
    System.out.println("X = " + X);
    System.out.println("Y = " + Y);

    degitir(X);
    System.out.println("DEGISTIR");
    System.out.println("X = " + X);
    System.out.println("Y = " + Y);

}

Sonuc:

X = ahmet
Y = ahmet
DEGISTIR
X = Java!
Y = Java!  --> Bunun degerini kim degistirdi?
permanent link

cevaplandı: 16 Eyl '14, 16:34

mahmut_can's gravatar image

mahmut_can ♦
2.9k62552
cevap kabul oranı: 67%

1

merhaba.

bu soruda istenmedik yan etkiler önemli değil. çünki bu kişiye reflection ı öğretmek için sorulmuş bir soru. buna ek olarak http://stackoverflow.com/a/25870393/225798 şu linkte değerin tam olarak nasıl değiştirilebileceği gösteriliyor (burada da yann etki olarak hash değeri değiştirilmiyor map lerde sorun çıkartacaktır ama önemli olan değiştirilebilmesi.).

Saygılarımla ...

(17 Eyl '14, 03:13) myururdurmaz myururdurmaz's gravatar image

Degistiremessiniz. Java call by value mantigi ile parametreleri metotlara aktariyor, yeni metot bünyesinde islemek istediginiz referans kopyalaniyor. Bu primitif veritipleri icin de gecerli. Call by reference mantigi olsa idi, o zaman x in degerini degistirebilirdiniz.

permanent link

cevaplandı: 15 Eyl '14, 10:40

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183
cevap kabul oranı: 52%

Teşekkür ederim.bu soruyu yapan bi yazılımcı sordu araştırmam için.. bayağ araştırdım kendisi yapmış..

(15 Eyl '14, 16:15) tugba tugba's gravatar image

Aklıma ilk olarak .net teki ref ,out keywordleri geldi ama javada karşılıklarını bulamadım. degistir metodunun parametresini primitive type yerine reference type yaparsan, yapmak istediğine ulaşırsın. Aşağıda örnek bir kod parçası paylaşıyorum. İllaki parametre primitive olacak diyorsan başka yöntemler araştırmaya devam etmek gerekecek

 public class MyClass {
        public String name;
    }

    public static void main(String[] args) {
          MyClass m=new MyClass();
        m.name="müslüm";

        System.out.println("X = " + m.name);
        degistir(m);
        System.out.println("X = " + m.name);
    }

    private static void degistir(MyClass myClass) {
        myClass.name = myClass.name + " öztürk";
    }

Console Çıktısı:

 X = müslüm

 X = müslüm öztürk

İyi çalışmalar

permanent link

cevaplandı: 15 Eyl '14, 12:48

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.7k103691
cevap kabul oranı: 28%

değiştirildi: 15 Eyl '14, 12:49

Teşekkürler..

(16 Eyl '14, 02:37) tugba tugba's gravatar image
private static String isim = "osman";

    static void degistir(String s)
    {
        isim = s;
    }

    public static void main(String args[])
    {
        System.out.println("birincisi: "+isim);
        degistir("mehmet");
        System.out.println("ikincisi: "+isim);
    }
permanent link

cevaplandı: 16 Eyl '14, 07:40

Forgewright's gravatar image

Forgewright
1264
cevap kabul oranı: 25%

Bu sorunun cevapi degil.

Soruda global field kullanilmamsi.

Selamlar

(16 Eyl '14, 07:43) mahmut_can ♦ mahmut_can's gravatar image

NOT : "//Sadece burada işlem yapılabilir " kısmında işlem yapılabilir diğer yerlerin aynı kalması gerekiyor..

(16 Eyl '14, 07:44) tugba tugba's gravatar image

@Forgewright soruda belirtilen örnekte tanımlanan X değişkeni main metodunun içindedir. Seni yaptığın gibi bir üst scope içinde değildir. Anladığım kadarıyla senin yaptığının gibi olmasını istemiyor.

(16 Eyl '14, 07:44) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Evet instance variable kullandım çünkü metod içinde tanımlanmış yerel değişkene başka bir metoddan ulaşmanın mümkün olduğunu zannetmiyorum.

(16 Eyl '14, 07:48) Forgewright Forgewright's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×13

Soruldu: 15 Eyl '14, 10:19

Görüntüleme: 857 kez

Son güncelleme: 17 Eyl '14, 03:15

powered by BitNami OSQA