- public class MM {
- private String name ; // 姓名
- private int age ;//年龄
- private String address ; // 住址
- public MM(String name){
- this.name = name ;
- }
- public String getName() {
- return name;
- }
- public
- void
- setName
- (String name)
- {
- this.name = name;
- }
- public
- int
- getAge
- ()
- {
- return age;
- }
- public
- void
- setAge
- (int age)
- {
- this.age = age;
- }
- public String getAddress() {
- return address;
- }
- public
- void
- setAddress
- (String address)
- {
- this.address = address;
- }
- }
- /**
- * Created by TigerChain
- * 追 MM 的方法,是一个抽象角色
- */
- public interface ZhuimmWay {
- // 送花
- void giveFlowers();
- // 写情书
- void writeLoveLetters();
- // 买衣服
- void buyClothes();
- // 干一些其它的事
- void doSomthing();
- }
- /**
- * Created by TigerChain
- * 主人公小明,真正的角色
- */
- public
- class
- XiaoMing
- implements
- ZhuimmWay
- {
- // 要追的 MM
- private MM mm ;
- public
- void
- like
- (MM mm)
- {
- this.mm = mm ;
- }
- @Override
- public
- void
- giveFlowers
- ()
- {
- System.out.println(mm.getName()+" 送给你一朵花");
- }
- @Override
- public
- void
- writeLoveLetters
- ()
- {
- System.out.println(mm.getName()+" 给你八封情书");
- }
- @Override
- public
- void
- buyClothes
- ()
- {
- System.out.println(mm.getName()+" 这是给你买的衣服");
- }
- @Override
- public
- void
- doSomthing
- ()
- {
- System.out.println("给 "+mm.getName()+"说好听的话");
- System.out.println("给 "+mm.getName()+"洗衣服,买单等等一系列手段");
- }
- }
- /**
- * Created by TigerChain
- * 代理人,我上场了,感觉像媒婆
- */
- public
- class
- ProxyTigerChain
- implements
- ZhuimmWay
- {
- private XiaoMing xiaoMing ;
- public ProxyTigerChain(XiaoMing xiaoMing, MM mm){
- this.xiaoMing = xiaoMing ;
- xiaoMing.like(mm);
- }
- @Override
- public
- void
- giveFlowers
- ()
- {
- xiaoMing.giveFlowers();
- }
- @Override
- public
- void
- writeLoveLetters
- ()
- {
- xiaoMing.writeLoveLetters();
- }
- @Override
- public
- void
- buyClothes
- ()
- {
- xiaoMing.buyClothes();
- }
- @Override
- public
- void
- doSomthing
- ()
- {
- xiaoMing.doSomthing();
- }
- }
- public class Test {
- public
- static
- void
- main
- (String args[])
- {
- // 主人公小明
- XiaoMing xiaoMing = new XiaoMing();
- // 要追的人小倩
- MM xiaoqian = new MM("小倩") ;
- // 小明委托我去帮他追小倩
- ProxyTigerChain proxyChain = new ProxyTigerChain(xiaoMing,xiaoqian) ;
- proxyChain.giveFlowers();
- proxyChain.writeLoveLetters();
- proxyChain.buyClothes();
- proxyChain.doSomthing();
- }
- }
- /**
- * Created by TigerChain
- * 定义一个工厂类,这样就屏蔽了客户端对代理的感知
- */
- public class ZhuimmFactory {
- public
- static
- ZhuimmWay
- getInstance
- (String name)
- {
- return new ProxyTigerChain(new XiaoMing(),new MM(name)) ;
- }
- }
- public class Test {
- public
- static
- void
- main
- (String args[])
- {
- // 调用者不知道调用的是代理类还是真实类,这才是正常的逻辑呀
- ZhuimmWay zhuimmWay = ZhuimmFactory.getInstance("小倩") ;
- zhuimmWay.giveFlowers();
- zhuimmWay.writeLoveLetters();
- zhuimmWay.buyClothes();
- zhuimmWay.doSomthing();
- }
- }
- /**
- * Created 抽象类,去西天的条件
- */
- public interface IToWest {
- //保护唐僧
- void baohuTangSeng();
- //降妖除魔
- void xiangYaoChuMo();
- //上天入地
- void shangTianRuDi();
- }
- /**
- * Created by Tigerchain
- * 悟空
- */
- public
- class
- SunWuKong
- implements
- IToWest
- {
- @Override
- public
- void
- baohuTangSeng
- ()
- {
- System.out.println("我孙悟空能 保护唐僧");
- }
- @Override
- public
- void
- xiangYaoChuMo
- ()
- {
- System.out.println("我孙悟空能 降妖除魔");
- }
- @Override
- public
- void
- shangTianRuDi
- ()
- {
- System.out.println("我孙悟空能 能上天入地");
- }
- }
- package prxoy.monkeyking;
- /**
- * Created by Tigerchain
- * 悟空的代理六耳猕猴
- */
- public
- class
- LiuErMiHou
- extends
- SunWuKong
- implements
- IToWest
- {
- @Override
- public
- void
- baohuTangSeng
- ()
- {
- super.baohuTangSeng();
- }
- @Override
- public
- void
- xiangYaoChuMo
- ()
- {
- super.xiangYaoChuMo();
- }
- @Override
- public
- void
- shangTianRuDi
- ()
- {
- super.shangTianRuDi();
- }
- }
- /**
- * Created by TigerChain
- * 测试类 六耳 代理悟空
- */
- public class Test {
- public
- static
- void
- main
- (String args[])
- {
- IToWest liuErMiHou = new LiuErMiHou() ;
- liuErMiHou.baohuTangSeng();
- liuErMiHou.xiangYaoChuMo();
- liuErMiHou.shangTianRuDi();
- System.out.println("我孙悟空能去得了西天");
- }
- }
- /* {@code Proxy} provides static methods for creating dynamic proxy
- * classes and instances, and it is also the superclass of all
- * dynamic proxy classes created by those methods.
- * .....
- *
- /
- public class Proxy implements java.o.Serializable {
- .... 省略代码
- }
- public static Object newProxyInstance(ClassLoader loader,
- Class<?>[] interfaces,
- InvocationHandler h){
- ... // 省略若干代码
- // 取得代理类
- Class<?> cl = getProxyClass0(loader, intros)
- ... // 省略若干代码
- // 调用代理类的构造方法
- final Constructor<?> cons = cl.getConstructor(constructorParams);
- ... // 省略若干代码
- final InvocationHandler ih = h;
- ... // 省略若干代码
- // 通过代理类的构造方法生成代理类的实例
- return cons.newInstance(new Object[]{h});
- }
- public interface InvocationHandler {
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable;
- }
- /**
- * 动态代理类
- */
- public
- class
- ToWestProxy
- implements
- InvocationHandler
- {
- // 需要代理的对象即真实对象
- private Object delegate ;
- public Object getProxy(Object delegate){
- this.delegate = delegate ;
- // 动态构建一个代理
- return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces(),this);
- }
- @Override
- public
- Object
- invoke
- (Object proxy, Method method, Object[] args)
- throws
- Throwable
- {
- return method.invoke(delegate,args) ; // 通过反射调用真实对象对应的方法
- }
- }
- /**
- * Created by TigerChain
- * 测试类
- */
- public class Test {
- public
- static
- void
- main
- (String args[])
- {
- IToWest sunWuKong = new SunWuKong() ;
- // 取得动态代理
- IToWest proxy = (IToWest) new ToWestProxy().getProxy(sunWuKong);
- proxy.baohuTangSeng();
- proxy.xiangYaoChuMo();
- proxy.shangTianRuDi();
- System.out.println("我孙悟空能去得了西天");
- }
- }
- /**
- * Created by TigerChain
- * 定义一个抽象接口
- */
- public interface ISellTicket {
- // 售票
- void sellTicket();
- }
- /**
- * Created by TigerChain
- * 买票的人
- */
- public class User {
- private String uname ; //姓名
- private String address ; // 地址
- private String sex ; // 性别
- private String idNum ; // 身份证号
- private String pay ; // 掏票钱
- public String getUname() {
- return name;;
- }
- public
- void
- setUname
- (String uname)
- {
- this.uname = name;
- }
- public String getAddress() {
- return address;
- }
- public
- void
- setAddress
- (String address)
- {
- this.address = address;
- }
- public String getSex() {
- return sex;
- }
- public
- void
- setSex
- (String sex)
- {
- this.sex = sex;
- }
- public String getIdNum() {
- return idNum;
- }
- public
- void
- setIdNum
- (String idNum)
- {
- this.idNum = idNum;
- }
- public String getPay() {
- return pay;
- }
- public
- void
- setPay
- (String pay)
- {
- this.pay = pay;
- }
- }
- /**
- * Created 真实的售票员小张
- */
- public
- class
- XiaoZhangSeller
- implements
- ISellTicket
- {
- private User user ;
- public XiaoZhangSeller(User user){
- this.user = user ;
- }
- @Override
- public
- void
- sellTicket
- ()
- {
- if(null !=user){
- System.out.println("买票者的信息===============");
- System.out.println("买票者姓名:"+user.getUname());
- System.out.println("买票性别:"+user.getSex());
- System.out.println("买票者身份证号:"+user.getIdNum());
- System.out.println("买票者住址:"+user.getUname());
- System.out.println("==============================") ;
- System.out.println("正在验证信息...信息无误,请支付票钱");
- System.out.println("买票者支付:"+user.getPay()+" 元");
- System.out.println("请稍等正在出票.....");
- System.out.println("出票成功:从西安到宝鸡大巴进站去坐");
- }
- }
- }
- /**
- * Created by TigerChain
- * 自动出票机,为了演示名字这样想,其实这是一个万能的动态代理
- */
- public
- class
- DyAutoSellerProxy
- implements
- InvocationHandler
- {
- private Object object ;
- public DyAutoSellerProxy(Object object){
- this.object = object ;
- }
- @Override
- public
- Object
- invoke
- (Object proxy, Method method, Object[] args)
- throws
- Throwable
- {
- return method.invoke(object,args) ;
- }
- }
- /**
- * Created by TigerChain
- * 测试类
- */
- public class Test {
- public
- static
- void
- main
- (String args[])
- {
- // 定义个买票者
- User tigerChain = new User() ;
- tigerChain.setUname("TigerChain");
- tigerChain.setAddress("中国陕西");
- tigerChain.setSex("男");
- tigerChain.setIdNum("610326************");
- tigerChain.setPay("45.00");
- // 真实的买票员小张
- ISellTicket iSellTicket = new XiaoZhangSeller(tigerChain) ;
- // 动态代理
- DyAutoSellerProxy dyAutoSellerProxy = new DyAutoSellerProxy(iSellTicket) ;
- // 动态创建一个出票机,把出票交给出票机去处理
- ISellTicket iSellTicket1 = (ISellTicket) Proxy.newProxyInstance(iSellTicket.getClass().getClassLoader(),iSellTicket.getClass().getInterfaces(),dyAutoSellerProxy);
- iSellTicket1.sellTicket();
- }
- }
- interface CustomAIDL {
- String getStr() ;
- }
图标构造一下项目,此时会在
文件「把 AS 切换到 project 视图下很容易找到」,这是 IDE 帮我们自动生成的
- /**
- * @Description 创建一个远程服务
- * @Creator TigerChain(创建者)
- */
- public
- class
- AIDLRemoteService
- extends
- Service
- {
- private final CustomAIDL.Stub aidl = new CustomAIDL.Stub() {
- @Override
- public
- String
- getStr
- ()
- throws
- RemoteException
- {
- return " 我是远程服务返回的 HELLO ";
- }
- } ;
- @Nullable
- @Override
- public IBinder onBind(Intent intent) {
- return aide;
- }
- }
- public
- class
- AidlActivity
- extends
- AppCompatActivity
- implements
- View
- .
- OnClickListener
- {
- private CustomAIDL customAIDL ;
- ... 省略若干代码
- // 客户端连接服务
- private ServiceConnection serviceConnection = new ServiceConnection() {
- @Override
- public
- void
- onServiceConnected
- (ComponentName name, IBinder service)
- {
- customAIDL = CustomAIDL.Stub.asInterface(service) ;
- Log.e("service:","onServiceConnected") ;
- isServerStarted = true ;
- }
- @Override
- public
- void
- onServiceDisconnected
- (ComponentName name)
- {
- customAIDL = null ;
- Log.e("service:","onServiceDisconnected") ;
- isServerStarted = false ;
- }
- } ;
- @Override
- public
- void
- onClick
- (View v)
- {
- switch (v.getId()){
- case R.id.btn_bind_service:
- // 绑定服务
- bindService(new Intent(AidlActivity.this,AIDLRemoteService.class),serviceConnection, Context.BIND_AUTO_CREATE) ;
- break ;
- case R.id.btn_test_method:
- if(!isServerStarted){
- Toast.makeText(AidlActivity.this,"请先绑定服务先",Toast.LENGTH_SHORT).show();
- return ;
- }
- try {
- String str = customAIDL.getStr();
- Toast.makeText(AidlActivity.this,str,Toast.LENGTH_SHORT).show();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- break ;
- default:
- break ;
- }
- }
- ... 省略若干代码
- }
- <service android:name=".Proxy.AIDL.AIDLRemoteService" android:process=":reomte">
- </service>
- // 这里的 IInterface 代表远程 Server对象有什么能力
- public
- interface
- CustomAIDL
- extends
- android
- .
- os
- .
- Interface
- {
- /**
- * Local-side IPC implementation stub class.
- */
- // 在 server 端调用
- public static abstract
- class
- Stub
- extends
- android
- .
- os
- .
- Binder
- implements
- designpattern
- .
- jun
- .
- com
- .
- designpattern
- .
- CustomAIDL
- {
- private static final java.lang.String DESCRIPTOR = "designpattern.jun.com.designpattern.CustomAIDL";
- /**
- * Construct the stub at attach it to the interface.
- */
- public Stub() {
- this.attachInterface(this, DESCRIPTOR);
- }
- /**
- * Cast an IBinder object into an designpattern.jun.com.designpattern.CustomAIDL interface,
- * generating a proxy if needed.
- * 其中的 android.os.IBinder obj 对象是驱动给们的,这个就是我们绑定 service ,在 onServiceConnecttion 回调里面这个对象拿到一个远程的 Service
- */
- public static designpattern.jun.com.designpattern.CustomAIDL asInterface(android.os.IBinder obj) {
- if ((obj == null)) {
- return null;
- }
- android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
- if (((iin != null) && (iin instanceof designpattern.jun.com.designpattern.CustomAIDL))) {
- // client 和 Server 在同一个进程调用 后面 debug 可以验证
- return ((designpattern.jun.com.designpattern.CustomAIDL) win);
- }
- // cliet 和 Server 不在同一个进程调用代理对象 后面 debug 可以验证
- return new designpattern.jun.com.designpattern.CustomAIDL.Stub.Proxy(obj);
- }
- @Override
- public android.os.IBinder asBinder() {
- return this;
- }
- @Override
- public
- boolean
- onTransact
- (int code, android.os.Parcel data, android.os.Parcel reply, int flags)
- throws
- android.os.RemoteException
- {
- // 给客户端写数据
- switch (code) {
- case INTERFACE_TRANSACTION: {
- reply.writeString(DESCRIPTOR);
- return true;
- }
- case TRANSACTION_getStr: {
- data.enforceInterface(DESCRIPTOR);
- java.lang.String _result = this.getStr();
- reply.writeNoException();
- reply.writeString(_result);
- return true;
- }
- }
- return super.onTransact(code, data, reply, flags);
- }
- // 运行在客户端 server 进程的远程代理,实现对远程对象的仿问
- private static
- class
- Proxy
- implements
- designpattern
- .
- jun
- .
- com
- .
- designpattern
- .
- CustomAIDL
- {
- private android.os.Binder mRemote;
- Proxy(android.os.IBinder remote) {
- mRemote = remote;
- }
- @Override
- public android.os.IBinder asBinder() {
- return mRemote;
- }
- public java.lang.String getInterfaceDescriptor() {
- return DESCRIPTOR;
- }
- @Override
- public java.lang.String getStr() throws android.os.RemoteException {
- // 读取服务端写过来的数据
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- java.lang.String _result;
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- mRemote.transact(Stub.TRANSACTION_getStr, _data, _reply, 0);
- _reply.readException();
- _result = _reply.readString();
- } finally {
- _reply.recycle();
- _data.recycle();
- }
- return _result;
- }
- }
- static final int TRANSACTION_getStr = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
- }
- public java.lang.String getStr() throws android.os.RemoteException;
- }
- <service android:name=".Proxy.AIDL.AIDLRemoteService" android:process=":reomte">
- </service>
- <service android:name=".Proxy.AIDL.AIDLRemoteService" />
来源: https://juejin.im/post/5a142a6451882534af259570