android aop( 二)实现方式之动态代理

本文探讨了Android中AOP的动态代理实现,虽然这种方式侵入性强,不利于维护,但在理解其他AOP实现方式的原理时非常重要。通过一个用户行为接口,动态代理用于在用户收藏和关注操作前检查用户是否已登录。这种方式使得登陆需求变更时只需在一个地方修改,若需添加更多执行前后的需求,可以通过扩展接口实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前说了aop有四种实现方式,其中最不推荐的就是动态代理实现,因为它浸入代码强,不利于维护,但是也要知道,因为其他实现方式里面的原理也用到了动态代理,只是封装更好 用起来更简单

 

比如一个app要收藏或者关注必须是用户已经登陆情况,除非是app可以是游客的情况下登陆也能收藏或者关注,这是另话了,

我定义了一个用户行为接口 有收藏和关注方法

public interface IUser {
    void save();
    void collect(int id);
    void attention(int id);
}

上面是代理的实现

public class MainActivity extends AppCompatActivity implements IUser {
    private IUser iUser;
    private Button btnCollect,btnAttention;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iUser = (IUser) Proxy.newProxyInstance(IUser.class.getClassLoader(),
                new Class[]{IUser.class}, new UserHandler(this));

        btnCollect = findViewById(R.id.activity_main_btn_collect);
        btnAttention = findViewById(R.id.activity_main_btn_attention);
        btnCollect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                collect();
            }
        });
        btnAttention.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                attention();
            }
        });
    }

    private void attention() {
        iUser.attention(100);
    }

    private void collect() {
        iUser.collect(100);
    }

    @Override
    public void save() {

    }
    @Override
    public void collect(int id) {
        Log.e("UserHandler","用户收藏");
    }

    @Override
    public void attention(int id) {
        Log.e("UserHandler","用户关注");
    }
}
UserHandler.java
public class UserHandler implements InvocationHandler {
    private static final String TAG = "UserHandler";
    private IUser iUser;
    public UserHandler(IUser iUser) {
        this.iUser = iUser;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (iUser != null) {
            if(!isLogin()){
                Log.e(TAG,"正在登录...");
            }
            //模拟用户登录行为
            Thread.sleep(3000);
            Log.e(TAG,"登录成功...");
            return method.invoke(iUser, args);
        }
        return null;
    }
    private boolean isLogin() {
        return false;
    }
}

这样用户收藏和关注中的判断用户是否登陆,就直接放在动态代理做了,这样如果登陆有啥需求变动的话,就在一处改动就行,如果需要在执行收藏前后都加点其他需求的话,我们只要添加一个接口就行

public interface Operation {
    void before();
    void after();
}

在构造函数中传递过去

public class UserHandler implements InvocationHandler {
    private static final String TAG = "UserHandler";
    private IUser iUser;
    private Operation operation;
    public UserHandler(IUser iUser, Operation operation) {
        this.iUser = iUser;
        this.operation = operation;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (iUser != null) {
            operation.before();
            //模拟用户登录行为
            Thread.sleep(3000);
            Object object = method.invoke(iUser, args);
            operation.after();
            return object;
        }
        return null;
    }
}

这样为后面学习aop的第三种方式 理解有帮助.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值