2011-06-22 21 views
7

Bazı alan değerlerini almak için kullanılan yansıması olan bir sınıfınız olduğunda çöp koleksiyonunun nasıl çalıştığını merak ediyorum. JVM, bu alanlara referans verilen değerlerin erişilebilir olduğunu ve bu nedenle resmi dil sözdiziminin bunlara erişmek için kullanılmadığı zamanlarda çöp toplama için uygun olmadığının farkındadır?Çöp toplama ve yansıma

(yansıma aşırı vurguladı burada olmasına rağmen) sorunu gösteren küçük bir pasajı:

/** 
* 
*/ 

import java.lang.reflect.Field; 

public class B { 
    protected B previous = null, next = null; 

    /** 
    * 
    */ 
    public B(B from) { 
     this.previous = from; 
    } 

    public void transition(B to) { 
     this.next = to; 
    } 

    public B next() { 
     try { 
      Field f = getClass().getField("next"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 

    public B previous() { 
     try { 
      Field f = getClass().getField("previous"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 

Şerefe,
Chris

+0

İlginç bir soru. Bir çeşit gömülü Java uygulamasından ilham alındı ​​mı? –

+0

"Bazı alan değerlerini elde etmek için kullanılan yansımalı bir sınıf" ın ne anlama geldiğini netleştirmek için bir kod snippet'i ekleyebilir misiniz? –

+0

Aslında, bir ağ altyapısı için bir test üzerinde çalışıyorum ve bazı alanlara yansıma ile erişiliyor. Yansımanın bellek kullanımı üzerinde nasıl bir etkisi olduğunu merak ederek, belki de JVM ile ilgili objeleri emin olamıyor. –

cevap

10

bir örneğinin alanlarını erişen, o zaman olacak hala bu örnek için bir referansa ihtiyacım var. Bu vaka için GC hakkında anormal bir şey olmazdı.

+0

Teşekkürler, bu mantıklı geliyor :) –

5

Nesnenin bir alanına erişmek için o nesneye başvurmanız gerekir. Yansımalar yoluyla veya doğrudan erişirseniz, nesneye güçlü bir başvuru yapıp yapmadığınızı fark etmez.

1

Bu biraz garip bir deneme vakası: "Bu" ye erişmek için yansıma kullanıyorsunuz. Tanım olarak, "bu" beyan eden sınıfın bir örnek yönteminde kullanıldığında canlıdır, bu yüzden GCed olmayacaktır.

Ancak, daha çok nokta, yansıma, daha önce başvurduğunuz nesnelerdeki alanları vs. değiştirmenize izin verir. Bu size verebileceğin anahtar - ff 'yi inceleyecek örneğe yansıt, açıkça nesneyle ilgili bir referans var, bu yüzden hayatta kalıyor.

İlgili konular