java反射--单例和接口代理

记录一次代理的使用
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值