公开调用私有Java方法?
生活随笔
收集整理的這篇文章主要介紹了
公开调用私有Java方法?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們是Java開發人員,在Java中已知4種訪問修飾符:私有,受保護,公共和包。 好吧,除了私有外,最后三個可以通過繼承,相同的包或實例從類外部調用。
現在,常見的問題是,可以公開(從外部類中)公開私有嗎? 答案是否定的。 使用“常規”方式訪問它時為“否”,而使用Java本身提供的Reflection API“侵入”它時為“是”。
好吧,現在編寫我們將要破解的代碼。 我稱它為“ 受害者 ”
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 。 您可以在屏幕上看到輸出。
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好的,本教程已達到目的。 現在您知道Java的Reflection API是編程語言的非常強大的功能。 完全取決于您自己的目的來修改或擴展它。 玩Java
參考: 公開調用私有方法? 來自我們的JCG合作伙伴 Ronald Djunaedi,來自Naming Exception博客。
翻譯自: https://www.javacodegeeks.com/2012/06/calling-private-java-methods-publicly.html
總結
以上是生活随笔為你收集整理的公开调用私有Java方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的应用开发用什么语言(linu
- 下一篇: 海外电脑网易云音乐播放器(国外电脑听网易