程序运行时类创建的代理方法称为动态代理。也就是说,在这种情况下,代理类不是在Java代码中定义的,而是在运行时根据我们在Java代码中的指令动态生成的。与静态代理相比,动态代理的优势在于可以方便地统一处理代理类的功能,而无需修改每个代理类的功能。
那么如何使用动态代理IP呢?首先,我们需要在代理类和委托类之间定义一个中介类。实现InvocationHandler接口需要这个中介类。从名称InvocationHandler中,我们可以知道实现这个接口的中介类被用作“调用处理器”。
当我们调用代理类对象的方法时,这个“调用”将被转移到invoke方法。代理类对象作为代理参数传入。参数方法标识我们具体调用代理类的哪个方法,args是这个方法的参数。这样,我们对代理类中所有方法的调用都会变成对invoke的调用,这样我们就可以给invoke方法添加统一的处理逻辑(或者根据方法参数对不同的代理类方法做不同的处理)。因此,我们只需要在中介类的invoke方法实现中输出“before”,然后调用委托类的invoke方法,再输出“after”。在动态代理模式下,要求委托类必须实现一个接口,这里我们实现了Sell接口。如上所述,中介类必须实现InvocationHandler接口作为调用处理器来“拦截”对代理类方法的调用。
简单总结一下:首先我们通过newProxyInstance方法获取代理类实例,然后我们可以通过这个代理类实例调用代理类方法。事实上,对代理类方法的调用将调用中间类(调用处理器)的invoke方法。在invoke方法中,我们调用委托类的相应方法,并添加我们自己的处理逻辑。