既然来了简书,总要留下点什么.......
1.WHAT
为其它对象提供一种代理,以控制对这个对象的访问。
2.CLASSIFY
1.静态代理
2.动态代理
3.WHERE
4.EXAMPLE——静态代理
4.1 目标接口 —— 上分
public interface IUpperScore {
/**
* 上分
*/
public void upperScore();
}
4.2 代理对象 —— 王者
public class GorgeKing implements IUpperScore {
private IUpperScore mUpperScore;
/**
* 持有被代理的对象
* @param upperScore
*/
public GorgeKing(IUpperScore upperScore){
this.mUpperScore = upperScore;
}
@Override
public void upperScore() {
System.out.println("开始双排");
mUpperScore.upperScore();
System.out.println("一路连胜");
}
}
4.3 被代理对象 —— 塑料
public class GorgeSilver implements IUpperScore{
private String mId;
public GorgeSilver(String id){
this.mId = id;
}
@Override
public void upperScore() {
System.out.println(mId + "上分");
}
}
5.EXAMPLE——动态代理
GorgeSilver gorgeSilver = new GorgeSilver("my");
//返回IUpperScore的一个实例 这个对象是由Java给我们创建的
IUpperScore upperScore =
(IUpperScore) Proxy.newProxyInstance(
IUpperScore.class.getClassLoader(),
new Class<?>[]{IUpperScore.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始双排");
//调用被代理对象的方法
Object myObject = method.invoke(gorgeSilver,args);
System.out.println("一路连胜");
return myObject;
}
});
//当调用方法时会来到InvocationHandler的invoke方法
upperScore.upperScore();
敲黑板
动态代理方法的三个参数
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
源码分析参考文章://www.greatytc.com/p/87eac580b272