Теперь общий вопрос: можно ли публично называть личное (извне)? хорошо, ответ НЕТ и ДА. Нет, когда вы используете «обычный» способ доступа к нему, и ДА, когда вы «взламываете» его, используя Reflection API, предоставляемый самой Java.
Хорошо, теперь просто напишите код, который мы взломаем. Я назвал это « TheVictim »
01
02
03
04
05
06
07
08
09
10
11
12
|
package com.namex.hack; public class TheVictim { private void hackTest() { System.out.println( "hackTest called" ); } private static void hackTestStatic() { System.out.println( "hackTestStatic called" ); } } |
Теперь, после этого, просто следуйте моему коду и попробуйте запустить его. Я гарантирую, что если вы все правильно выполните, вы получите TheVictim для вызова как hackTest, так и hackTestStatic . И вы можете увидеть результат на вашем экране.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.namex.hack; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class HackTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class c = TheVictim. class ; Method[] ms = c.getDeclaredMethods(); for (Method each : ms) { String methodName = each.getName(); each.setAccessible( true ); // this is the key if (Modifier.isPrivate(each.getModifiers())) { if (Modifier.isStatic(each.getModifiers())) { // static doesnt require the instance to call it. each.invoke(TheVictim. class , new Object[] {}); } else { each.invoke( new TheVictim(), new Object[] {}); } } } } } |
Пример вывода :
1
2
|
hackTestStatic called hackTest called |
Хорошо, этот учебник выполнил свою задачу. Теперь вы знаете, что Reflection API java — очень мощная функция языка программирования. И все зависит от вас, чтобы изменить или даже расширить его для ваших собственных целей. Веселиться с Java
Ссылка: публичный вызов частных методов? от нашего партнера JCG Рональда Джунаеди в блоге Naming Exception .