android- using reflection (reflection type internal static, non-static inner classes, anonymous inner classes, etc.)

The code directly on com. **. Routerdemo replaced package names

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


public class ReflectionUtils {

    public static void invokeInnerStaticClass() {
        try {
            Class clazz = Class.forName("com.**.routerdemo.Test$InnerStaticClass");
            Constructor constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            Object instance = constructor.newInstance();
            Method printM = clazz.getDeclaredMethod("print", String.class);
            printM.setAccessible(true);
            printM.invoke(instance, "I am InnerStaticClass");

            Method getNameM = clazz.getDeclaredMethod("getName");
            getNameM.setAccessible(true);
            System.out.println("cxx getclassname=" + getNameM.invoke(instance));

        } catch (Exception e) {
            System.out.println("cxx Exception >>" + e.getMessage());
        }
    }

    public static void invokeNormalStaticClass() {
        try {
            Class outerCls = Class.forName("com.**.routerdemo.Test");
            Constructor outerConstructor = outerCls.getDeclaredConstructor();
            outerConstructor.setAccessible(true);
            Object outerInstance = outerConstructor.newInstance();

            //正常内部类实例化 new Test().new InnerNormalClass();
            Class clazz = Class.forName("com.**.routerdemo.Test$InnerNormalClass");
            Constructor constructor = clazz.getDeclaredConstructor(outerCls);
            constructor.setAccessible(true);
            Object instance = constructor.newInstance(outerInstance);

            Method printM = clazz.getDeclaredMethod("print", String.class);
            printM.setAccessible(true);
            printM.invoke(instance, "I am InnerStaticClass");

            Method getNameM = clazz.getDeclaredMethod("getName");
            getNameM.setAccessible(true);
            System.out.println("cxx getclassname=" + getNameM.invoke(instance));

        } catch (Exception e) {
            System.out.println("cxx Exception >>" + e.getMessage());
        }
    }

    public static void invokeMethod() {
        try {
            Bean bean1 = new Bean();
            bean1.setVerCode(1);
            Bean bean2 = new Bean();
            bean2.setVerCode(1);

            Class cls = Class.forName("com.**.routerdemo.Test");
            Constructor constructor = cls.getDeclaredConstructor();
            Method method = cls.getDeclaredMethod("equal", Bean.class, Bean.class);
            method.setAccessible(true);
            System.out.println("cxx is equal>>" + method.invoke(constructor.newInstance(), bean1, bean2));
        } catch (Exception e) {
            System.out.println("cxx e>>>" + e.getMessage());
        }
    }

    public static void invokeAnonymousClass() {
        try {
            Class clazz = Class.forName("com.**.routerdemo.Test");
            Constructor constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            Object outerInstance = constructor.newInstance();

            Field field = clazz.getDeclaredField("runnable");
            field.setAccessible(true);
            Runnable r = (Runnable) field.get(outerInstance);
            r.run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void InvokeInnerClasses() {
        try {
            Class clazz = Class.forName("com.**.routerdemo.Test");
            Object container = clazz.newInstance();
            Class innerClazz[] = clazz.getDeclaredClasses();
            for (Class cls : innerClazz) {
                int mod = cls.getModifiers();
                String modifier = Modifier.toString(mod);
                if (modifier.contains("static")) {
                    //构造静态内部类实例
                    Constructor innerStatic = cls.getDeclaredConstructor();
                    innerStatic.setAccessible(true);
                    Method printM = cls.getDeclaredMethod("print", String.class);
                    printM.setAccessible(true);
                    printM.invoke(innerStatic.newInstance(), "I am InnerStaticClass");
                } else {
                    Constructor innerNormal = cls.getDeclaredConstructor(clazz);
                    innerNormal.setAccessible(true);
                    Method print = cls.getDeclaredMethod("print", String.class);
                    print.setAccessible(true);
                    print.invoke(innerNormal.newInstance(container), "I am innerNormal");
                }
            }
            // 获取匿名内部类实例
            Field field = clazz.getDeclaredField("runnable");
            field.setAccessible(true);
            Runnable r = (Runnable) field.get(container);
            r.run();

            // 获取静态成员变量
            Field staticField = clazz.getDeclaredField("paramStatic");
            staticField.setAccessible(true);
            staticField.setBoolean(container, true);
            System.out.println("cxx test staticParam " + Test.paramStatic);

            // 获取非静态成员变量
            Field normalField = clazz.getDeclaredField("paramNormal");
            normalField.setAccessible(true);
            normalField.setBoolean(container, true);
            System.out.println("cxx test paramNormal " + ((Test) container).paramNormal);

        } catch (Exception e) {
            System.out.println("cxx Exception >>" + e.getMessage());
        }
    }

}

 Reflected classes:

the Test class {public 

    Private static class InnerStaticClass { 

        Private void print (String STR) { 
            System.out.println ( "static inner Cxx print parameterized class method, the parameter" + STR); 
        } 

        Private String getName () { 
            return InnerStaticClass.class .getName (); 
        } 
    } 

    Private class InnerNormalClass { 

        Private void print (String STR) { 
            System.out.println ( "Cxx nonstatic inner parameterized class print method, the parameter" + STR); 
        } 

        Private String getName () { 
            return InnerNormalClass.class.getName (); 
        } 
    } 

    Private the Runnable Runnable new new = the Runnable () { 
        @Override
        public void run() {
            System.out.println("cxx 匿名内部类run方法");
        }
    };

    public static boolean paramStatic = false;

    public boolean paramNormal = false;

    private boolean equal(Bean a, Bean b) {
        return a.getVerCode() == b.getVerCode();
    }

}

 

Guess you like

Origin www.cnblogs.com/shoneworn/p/12047555.html