Genel olarak yansımanın olumsuz tarafları
Yansıtmanın anlaşılması, düz çizgi koddan daha zordur.
Tecrübelerime göre, yansıma Java'da "uzman düzeyinde" bir özelliktir. Çoğu programcının yansımayı hiçbir zaman aktif olarak kullanmadığını (yani yansıma kullanan kütüphaneleri tüketmenin sayılmadığını) savunuyorum. Bu kod, bu programcılar için anlaşılmasını zorlaştırıyor.
Yansıtma kodu statik analize erişilemiyor
Diyelim ki getFoo
sınıfımda bir alıcı var ve adını değiştirmek istiyorum getBar
. Eğer yansıma kullanmazsam, sadece kod tabanını araştırabilirim ve getFoo
alıcıyı kullanan her yeri bulabilirim, böylece güncelleyebilirim ve birini kaçırsam bile derleyici şikayet eder.
Ancak alıcıyı kullanan yer bir şeye benziyorsa callGetter("Foo")
ve callGetter
yaparsa getClass().getMethod("get"+name).invoke(this)
, yukarıdaki yöntem onu bulamaz ve derleyici şikayet etmez. Yalnızca kod gerçekten çalıştırıldığında bir a alırsınız NoSuchMethodException
. Ve bu istisnanın (izlenen) acı çektiğini hayal edin, callGetter
çünkü “yalnızca kodlanmış dizelerle kullanılır, aslında olamaz”. (Kimse bunu yapmaz, birisi tartışabilir mi? OP'nin SO cevabında aynen bunu yapması dışında . Alanın adı değiştirilirse, genel belirleyicinin kullanıcıları, belirleyicinin son derece belirsiz hatası dışında sessizce hiçbir şey yapmamanın farkına varamazlardı. Alıcı kullanıcılar, eğer şanslılarsa, göz ardı edilen istisnanın konsol çıktısını görebilirler.)
Yansıtma kodu derleyici tarafından kontrol edilmedi
Bu, temelde yukarıdakilerin büyük bir alt noktasıdır. Yansıma kodu tamamen ilgili Object
. Çalışma zamanında tipler kontrol edilir. Hatalar, birim testleri tarafından keşfedilir, ancak yalnızca kapsamınız varsa. (“Sadece bir alıcı, test etmem gerekmiyor.”) Temelde, Python üzerinden Java kullanarak avantajınızı kaybedersiniz.
Yansıtma kodu optimizasyon için kullanılamıyor
Belki teoride değil, pratikte, için bir satır içi önbellek sıralayan veya oluşturan bir JVM bulamazsınız Method.invoke
. Bu tür optimizasyonlar için normal yöntem çağrıları yapılabilir. Bu onları çok daha hızlı yapar.
Yansıtma kodu genel olarak sadece yavaş
Yansıma kodu için gerekli olan dinamik yöntem arama ve tür denetimi normal yöntem çağrılarından daha yavaştır. Bu ucuz tek hatlı alıcıyı bir yansıma canavarına çevirirseniz, (bunu ölçmedim) birkaç yavaşlama derecesine bakıyor olabilirsiniz.
Genel alıcı / ayarlayıcı için olumsuz
Bu sadece kötü bir fikir, çünkü sınıfınızın artık enkapsülasyonu yok. Sahip olduğu her alana erişilebilir. Hepsini herkese açık hale getirebilirsin.