Calling private Java methods publicly?
Now, the common question, can private be called publicly (from outside class)? well the answer is NO and YES. No when you use ‘usual’ way to access it, and YES when you ‘hack’ into it using the Reflection API provided by Java itself.
Well okay, now just write the code that we will hack into. I called it as “TheVictim“
package com.namex.hack; public class TheVictim { private void hackTest() { System.out.println("hackTest called"); } private static void hackTestStatic() { System.out.println("hackTestStatic called"); } }
Now after that, just follow my code and try to run it. I guarantee that if you followed it right, you will get TheVictim to call both of the hackTest and hackTestStatic. And you can see the output on your screen.
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[] {}); } } } } }
Output example:
hackTestStatic called hackTest called
Okay, this tutorial has met its purpose. Now you know the Reflection API of java is very powerful feature of programming language. And it’s all up to you to modify or even extend it for your own purpose. Have fun with Java
Reference: Calling private methods publicly ? from our JCG partner Ronald Djunaedi at the Naming Exception blog.