Java'da private
erişim değiştirici, sınıfın dışında görünmediği için güvenli kabul edilir. O zaman dış dünya da bu yöntemi bilmiyor.
Ancak Java yansımasının bu kuralı çiğnemek için kullanılabileceğini düşündüm. Aşağıdaki durumu düşünün:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Şimdi başka bir dersten Bilgi alacağım:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Şu anda hala özel yöntemin güvenli olduğunu düşündüm, çünkü yukarıdaki gibi bir şey yapmak için yöntemin adını bilmemiz gerekir. Ama eğer bir başkası tarafından yazılmış özel yöntem içeren bir sınıf varsa, bunların görünürlüğümüz yok.
Ama benim açımdan aşağıdaki kod satırından beri geçersiz hale geldi.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Şimdi bu method[]
yukarıda yapılması gereken her şeyi içerir. Sorum şu, Java yansımasını kullanarak bu tür şeylerden kaçınmanın bir yolu var mı?
Soruma açıklık getirmek için Java Belgelerinden bir noktadan alıntı yapıyorum .
Erişim Düzeyi Seçmeye İlişkin İpuçları:
Diğer programcılar sınıfınızı kullanırsa, yanlış kullanımdan kaynaklanan hataların olmamasını sağlamak istersiniz. Erişim düzeyleri bunu yapmanıza yardımcı olabilir. Belirli bir üye için anlamlı olan en kısıtlayıcı erişim düzeyini kullanın. Yapmamak için iyi bir nedeniniz yoksa özel kullanın.
getDeclaredMethods
işe yarayabilir, çünkü çöp gibi görünen isimler döndürür.