[Class] Accessing private fields/ calling private methods.

Discussion in 'Resources' started by WinSock, Jul 14, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    WinSock

    I have written a simple utility class that i call ClassUtils for getting info from private fields and to run private methods. This is useful if you have to get stuff from a private field in the minecraft source. For example i used it in CrowdControl to set a ghasts target manually.

    Example:
    Code:java
    1.  
    2. EntityGhast ghast = (EntityGhast) ((CraftGhast)entity).getHandle();
    3. try {
    4. ClassUtils.setPrivateField(ghast, "target", e.getHandle());
    5. } catch (Exception ex) {
    6. System.out.println("Error setting ghast target!");
    7. }
    8.  


    Class:
    Code:java
    1.  
    2. import java.lang.reflect.Field;
    3. import java.lang.reflect.InvocationTargetException;
    4. import java.lang.reflect.Method;
    5.  
    6. /**
    7.  * A utility class for accessing private fields, and calling private methods
    8.  * @author WinSock
    9.  * @version 1.0
    10.  */
    11. public class ClassUtils {
    12. @SuppressWarnings("unchecked")
    13. public static <T> T getPrivateField(Object object, String field) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    14. Class<?> clazz = object.getClass();
    15. Field objectField = clazz.getDeclaredField(field);
    16. objectField.setAccessible(true);
    17. return (T)objectField.get(object);
    18. }
    19. public static void setPrivateField(Object object, String field, Object value) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    20. Class<?> clazz = object.getClass();
    21. Field objectField = clazz.getDeclaredField(field);
    22. objectField.setAccessible(true);
    23. objectField.set(object, value);
    24. }
    25. Class<?> clazz = object.getClass();
    26. Class<?>[] paramClasses = new Class<?>[params.length];
    27. for (int i = 0; i < params.length; i++) {
    28. paramClasses = params.getClass();
    29. }
    30. Method m = clazz.getDeclaredMethod(method, paramClasses);
    31. m.setAccessible(true);
    32. return m.invoke(object, params);
    33. }
    34. }
    35.  
    36.  
     
  2. Offline

    Graindcafe

    I got an error line 29 : Type mismatch: cannot convert from Class<capture#6-of ? extends Object[]> to Class<?>[]
     
  3. Offline

    WinSock

Thread Status:
Not open for further replies.

Share This Page