2010-11-08 3 views
8

Bildiğiniz gibi, Spring, özel örnek değişkenlerine değerleri enjekte edebilir ve Hazırda bekletme, kalıcı sınıfların özel değişkenlerine erişebilir. Bununla birlikte, bir sınıfın korumalı yöntemlerini yansıma yoluyla bile arayamıyorum! Bahar ve Hazırda Bekletme, güvenliği nasıl açık bir şekilde ihlal edebilir? Ve daha da önemlisi, bunu nasıl yaparım? : Dİlkbahar/Hazırda Bekletme Özel Üyelerine Nasıl Erişebilir?

+0

http://stackoverflow.com/questions/3391256/how-java-jaxb-works sayfasının bir kopyası. – skaffman

cevap

8

, sen yöntem veya alan oluk yansımasını tekabül örneğini almak ve üzerinde setAccessible() çağırabilir. yapabilirsiniz

kullanma Java güvenlik yöneticisi elbette devre dışı Özel bir politika yazarak söyledi.

1

hazırda 'alanı' düzeyi erişim yapılandırma mekanizması üzerinden özel üyeleri erişebilir. Belgelerden, bölüm 5.1.11

"Erişim özelliği, Hazırda bekletme özelliğini çalışma zamanında özelliğe nasıl erişebileceğini kontrol etmenizi sağlar. Varsayılan olarak Hazırda Bekletme özelliği, get/set çiftini çağırır. Eğer access =" field "belirtirseniz, Hazırda Bekletme get/set çiftini atlayın ve yansımayı kullanarak doğrudan alana erişin. " yasaklayıcı güvenlik yöneticisi olmadan çalıştırırken

3

Sen yansıma aracılığıyla başka bir nesnenin özel bir değişken ayarlayabilirsiniz. İşte bunun nasıl yapılacağına dair bir örnek. Özel değişkenle aşağıdaki nesneyi düşünün:

public class MyBean { 
    private String message; 
} 

Normalde mesajı alan ancak SnoopyClass ayarlamak ve değerini alabilirsiniz dışında MyBean erişilebilir olmayacaktır. fieldName bir nesne fasulye ait denilen özel alan ve bir nesne fasulye fieldName denilen özel değişkenin değerini alabilirsiniz bir getValue yöntem haline bir değeri ayarlayabilirsiniz setValue: Ben iki statik yöntemler yazdı.

ana yöntem sadece, MyBean sınıfının bir nesnesi oluşturma mesajı değişken oluşturulmuş ve geri alarak kullanımını gösterir. Bu kodu gerçekten bağımsız bir uygulama olarak test ettim ve işe yarıyor. Bu yöntem hatta özel tüm alanlarda aramaya çünkü

import java.lang.reflect.Field; 

public class SnoopyClass { 

    private static void setValue(Object bean, String fieldName, Object value) 
      throws IllegalArgumentException, IllegalAccessException, 
      SecurityException, NoSuchFieldException { 
     Field privateVar = bean.getClass().getDeclaredField(fieldName); 
     privateVar.setAccessible(true); 
     privateVar.set(bean, value); 
    } 

    private static Object getValue(Object bean, String fieldName) 
      throws IllegalArgumentException, IllegalAccessException, 
      SecurityException, NoSuchFieldException { 
     Field privateVar = bean.getClass().getDeclaredField(fieldName); 
     privateVar.setAccessible(true); 
     return privateVar.get(bean); 
    } 

    public static void main(String[] argv) 
      throws IllegalArgumentException, SecurityException, 
      IllegalAccessException, NoSuchFieldException { 
     MyBean instance = new MyBean(); 
     setValue(instance, "message", "Shht! Don't tell anyone!"); 
     System.out.println("The message is '" + getValue(instance, "message")); 
    } 

} 

uygulanması, Nesne sınıfına getDeclaredField yöntemini kullanır. Buna karşılık, getField sadece ortak üyelere erişebilir. Bir sonraki adım okumak ve yazmak için setAccessible alanını çağırıyor. Son adım, java.lang.reflect.Field sınıfı tarafından sağlanan get ve set yöntemlerini kullanmanızdır.

manipülasyon Bu tür

güvenlik yöneticisi bu izin verdiği takdirde izin verilir. Varsayılan olarak Java, herhangi bir güvenlik yöneticisi yüklemez; bu nedenle IDE veya komut satırınız üzerinden başlattığınız bağımsız bir programda, bu tekniği kullanmak için herhangi bir sorun yaşamayacaksınız. Ayrıca, Tomcat'in altındaki bir Spring uygulamasında da denedim ve hala çalışıyor.

birincil uygulama

, en azından benim için, gereksiz belirleyiciler ile arayüz kirletmeden, özellikle bahar Fasulye için, benim birim testlerinde özel değişkenleri ayarlamak mümkün ediliyor.