动态实例化Interface

Example:

package com.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class Test {

    public interface A {
        void hello();
    }

    private static void test(A a) {
        a.hello();
    }

    public static void main(String[] args) {
        try {
            Class<?> AIntf = Class.forName("com.example.Test$A");
            Object proxy = Proxy.newProxyInstance(AIntf.getClassLoader(),
                    new Class[] { AIntf }, new InvocationHandler() {

                        @Override
                        public Object invoke(Object proxy, Method method, 
                                Object[] args) throws Throwable {
                            System.out.println("Hello World!");
                            return null;
                        }
                    });
            test((A) proxy);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Android-4.4中调用InputQueue的sendInputEvent注入Input事件:

Class<?> FinishedInputEventCallback = Class
        .forName("android.view.InputQueue$FinishedInputEventCallback");
Object proxy = Proxy.newProxyInstance(FinishedInputEventCallback.getClassLoader(),
        new Class[] { FinishedInputEventCallback }, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return null;
            }
        });
call(mInputQueue, "sendInputEvent", new Class[] { InputEvent.class, Object.class, boolean.class,
        FinishedInputEventCallback }, new Object[] { event, null, false, proxy });


private static Object call(Object obj, String method, Class<?>[] argsType, Object[] args) {
    Object ret = null;

    if (obj == null)
        return ret;

    try {
        Class<?> c = obj.getClass();
        Method m = c.getMethod(method, argsType);
        m.setAccessible(true);
        ret = m.invoke(obj, args);
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

    return ret;
}