Позовавайки се на защитени или частни клас Java: Уверете се, че е невъзможно?

7 февруари 2007 г. от davide
Пила под Java

Верният отговор е: "зависи от наличието или липсата на гаранция мениджър."

В действителност, чрез размисъл е възможно да отидете в сила ограниченията на езика Java, без прекалено много трудности, ammenochè не е просто за сигурност мениджър, единственият актьор в състояние наистина да управлява и евентуално да спрат тези видове сила.

Но сега сме в пример, който заслужава много дебати. Като се има предвид следното класа:

 package net.nothing2hide.test; public class ClassWithMethodsToHack { private void sayHello(String name){ System.out.println("Hello " + name + "! You're calling a private method"); } } 

Ние искаме да покаже как лесно да бъдат прилагани извън частния метод sayHello както я очаква тя да се използва силно отражение:

 package net.nothing2hide.test; public class PrivateMethodInvocationTest { /** * This sample class demonstrates how to * invoke a protected method on another class * * @param args */ public static void main(String[] args) { String myName = "Davide"; Method m; try { //Let'access the private method //by reflection. You could do the same //with a protected method m = ClassWithMethodsToHack.class.getDeclaredMethod( "sayHello", new Class[]{String.class}); if (m != null) { //Let's force the java language access //checks on the reflected method. Note //that if a security manager is defined //this workaround could not be permitted //and a SecurityException could be raised m.setAccessible(true); //And finally let's invoke the protected method m.invoke(new ClassWithMethodsToHack(), new Object[]{myName}); } } catch (Exception e) { e.printStackTrace(); } } }