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?
cevap
, 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.
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
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.
http://stackoverflow.com/questions/3391256/how-java-jaxb-works sayfasının bir kopyası. – skaffman