公开调用私有Java方法?
現(xiàn)在,常見(jiàn)的問(wèn)題是,可以公開(kāi)(從外部類(lèi)中)公開(kāi)私有嗎? 答案是否定的。 使用“常規(guī)”方式訪(fǎng)問(wèn)它時(shí)為“否”,而使用Java本身提供的Reflection API“侵入”它時(shí)為“是”。
好吧,現(xiàn)在編寫(xiě)我們將要破解的代碼。 我稱(chēng)它為“ 受害者 ”
package com.namex.hack;public class TheVictim {private void hackTest() {System.out.println("hackTest called");}private static void hackTestStatic() {System.out.println("hackTestStatic called");}}現(xiàn)在,在此之后,只需遵循我的代碼并嘗試運(yùn)行它即可。 我保證,如果您遵循正確,將使TheVictim調(diào)用hackTest和hackTestStatic 。 您可以在屏幕上看到輸出。
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 keyif (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[] {});}}}} }輸出示例 :
hackTestStatic called hackTest called好的,本教程已達(dá)到目的。 現(xiàn)在您知道Java的Reflection API是編程語(yǔ)言的非常強(qiáng)大的功能。 完全取決于您自己的目的來(lái)修改或擴(kuò)展它。 玩Java
參考: 公開(kāi)調(diào)用私有方法? 來(lái)自我們的JCG合作伙伴 Ronald Djunaedi,來(lái)自Naming Exception博客。
翻譯自: https://www.javacodegeeks.com/2012/06/calling-private-java-methods-publicly.html
總結(jié)
以上是生活随笔為你收集整理的公开调用私有Java方法?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux的应用开发用什么语言(linu
- 下一篇: Java Web应用程序的反跨站点脚本(