记录一次代理的使用
Demo 如下
public class Test {
public static void main(String[] args) {
try {
// 1、找到单例的类
Class<?> singletonClzz = Class.forName("com.example.lenovo.myclient.Singleton");
// 2、 获取单例对象的方法
Method getInstance = singletonClzz.getDeclaredMethod("getInstance", null);
// 3、 获取单例对象
Object instance = getInstance.invoke(null, null);
// 4、 获取接口
Class<?> callback = Class.forName("com.example.lenovo.myclient.MyCallback");
// 5、 获取代理
MyHandler myHandler = new MyHandler();
// 6、 绑定接口和代理
Object invokeCallback = Proxy.newProxyInstance(Test.class.getClassLoader(), new Class[]{callback}, myHandler);
// 7、 获取要反射的方法
Method run = singletonClzz.getMethod("run", callback);
// 8、 反射
run.invoke(instance, invokeCallback);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (NoSuchMethodException e) {
System.out.println(e.getMessage());
} catch (IllegalAccessException e) {
System.out.println(e.getMessage());
} catch (InvocationTargetException e) {
System.out.println(e.getMessage());
}
}
}
单例 Singleton
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
public static final Singleton instance = getInstance();
private static Singleton getInstance() {
return new Singleton();
}
}
public void run(MyCallback callback) {
callback.doCallback("doCallback!!!!");
callback.doingCallback("doingCallback!!!!");
}
}
接口 MyCallback
public interface MyCallback {
/**
* 方法1
*
* @param s
*/
void doCallback(String s);
/**
* 方法2
*
* @param s
*/
void doingCallback(String s);
}
反射代理 MyHandler
public class MyHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke Method: "+method.getName()+" args: "+args[0]);
return null;
}
}