动态代理实现过程
定义接口
interface Animal{
public void eat(String food)
}
获取代理实例并调用实力上的方法
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.v("test", method.getName());
Log.v("test", "看,那个动物吃"+args[0]+"了");
return null;
}
};
Animal animal = (Animal)Proxy.newProxyInstance(Animal.class.getClassLoader(),new Class[]{Animal.class},handler);
animal.eat("豆子");
- 动态代理会生成接口或者实现接口的类的实例
- 该实例并非静态代码实例
- 动态实例方法调用时,会出发InvocationHandler中invoke方法
- 在invoke方法中可以做一些动态处理
应用
-
1.框架设计,生成代理实例给框架内部使用。如Retrofit
框架将公共的操作抽象封装(如网络请求等),用户只需要设置个性化的参数即可(如设置接口地址,参数等) -
2.框架设计,生成动态代理实例给客户端使用。如Spring框架
网友评论