美文网首页
JDK-动态代理

JDK-动态代理

作者: 火乐君_52cd | 来源:发表于2020-03-30 09:44 被阅读0次

    接口

    public interface Fruit {
        public void show();
    }
    

    实现类

    public class Apple implements Fruit{
        @Override
        public void show() {
            System.out.println("<<<<show method is invoked");
        }
    }
    

    代理类

    public class DynamicAgent {
    
        //实现InvocationHandler接口,并且可以初始化被代理类的对象
        static class MyHandler implements InvocationHandler {
            private Object proxy;
            public MyHandler(Object proxy) {
                this.proxy = proxy;
            }
                
            //自定义invoke方法
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(">>>>before invoking");
                //真正调用方法的地方
                Object ret = method.invoke(this.proxy, args);
                System.out.println(">>>>after invoking");
                return ret;
            }
        }
    
        //返回一个被修改过的对象
        public static Object agent(Class interfaceClazz, Object proxy) {
            return Proxy.newProxyInstance(interfaceClazz.getClassLoader(), new Class[]{interfaceClazz},
                    new MyHandler(proxy));
        }    
    }
    

    示例方法

    public class ReflectTest {
        public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
            //注意一定要返回接口,不能返回实现类否则会报错
            Fruit fruit = (Fruit) DynamicAgent.agent(Fruit.class, new Apple());
            fruit.show();
        }
    }
    

    相关文章

      网友评论

          本文标题:JDK-动态代理

          本文链接:https://www.haomeiwen.com/subject/hdemuhtx.html