动态代理分为Java SDK 动态代理以及cglib动态代理,这里先了解下Java SDK动态代理
Java SDK动态代理代码demo:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKDynamicProxyDemo {
static interface Iservice {
void sayHello();
}
static class Service implements Iservice {
@Override
public void sayHello() {
System.out.println("say hello~~~~~");
}
}
static class JDKInvocationHandler implements InvocationHandler {
//被代理对象
private Object object;
public JDKInvocationHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before--say hello");
Object invoke = method.invoke(object, args);
System.out.println("after--say hello");
return invoke;
}
/**
* 生成代理类对象
*
* @return
*/
public Object newProxyInstance() {
return Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
this);
}
}
public static void main(String[] args) {
JDKInvocationHandler jdkInvocationHandler = new JDKInvocationHandler(new Service());
Iservice service = (Iservice) jdkInvocationHandler.newProxyInstance();
service.sayHello();
}
}
运行结果如下:
可以发现Java SDK动态代理其实是使用了Proxy与InvocationHandler配合,由Proxy在运行期生成代理对象,之后代理对象调用相应的方法,最后实际上真正调用的却是实现了InvocationHandler接口的类的invoke()方法中的逻辑。
总结
动态代理采用了运行期生成代理对象的方式,相比起静态代理,使用动态代理可以省去大量的静态代理类。