Теперь общий вопрос: можно ли публично называть личное (извне)? хорошо, ответ НЕТ и ДА. Нет, когда вы используете «обычный» способ доступа к нему, и ДА, когда вы «взламываете» его, используя 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 calledhackTest called |
Хорошо, этот учебник выполнил свою задачу. Теперь вы знаете, что Reflection API java — очень мощная функция языка программирования. И все зависит от вас, чтобы изменить или даже расширить его для ваших собственных целей. Веселиться с Java
Ссылка: публичный вызов частных методов? от нашего партнера JCG Рональда Джунаеди в блоге Naming Exception .
