【android学习】android动态代理

简介

为其他对象提供一种代理以控制对这个对象的访问。某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以再两者之间起到中介作用。运行阶段才指定代理哪个对象

  • 静态代理

Subject 类

public interface Subject {
    public void sayGoodBye();
    public void sayHello(String str);
}

 RealSubject 类

public class RealSubject implements Subject{
    @Override
    public void sayGoodBye() {
        Log.d("zkq","RealSubject sayGoodBye");
    }

    @Override
    public void sayHello(String str) {
        Log.d("zkq","RealSubject sayHello  " + str);
    }
}

 ProxySubject 类

public class ProxySubject implements Subject{

    private Subject subject;

    public ProxySubject(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void sayGoodBye() {

        //代理类,功能的增强
        Log.d("zkq","ProxySubject sayGoodBye begin");
        //在代理类的方法中 间接访问被代理对象的方法
        subject.sayGoodBye();
        Log.d("zkq","ProxySubject sayGoodBye end");

    }

    @Override
    public void sayHello(String str) {
        //代理类,功能的增强
        Log.d("zkq","ProxySubject sayHello begin");
        //在代理类的方法中 间接访问被代理对象的方法
        subject.sayHello(str);
        Log.d("zkq","ProxySubject sayHello end");

    }
}

在mainActivity中调用

    public void onStaticClick(View view) {

        //被代理的对象,某些情况下 我们不希望修改已有的代码,我们采用代理来间接访问
        RealSubject realSubject = new RealSubject();
        //代理类对象
        ProxySubject proxySubject = new ProxySubject(realSubject);
        //调用代理类对象的方法
        proxySubject.sayGoodBye();
        Log.d("zkq", "******");
        proxySubject.sayHello("Test");
    }

 在调用RealSubject 的方法时候,同步调用了RealSubject 中的方法

log日志

 D/zkq: ProxySubject sayGoodBye begin
 D/zkq: RealSubject sayGoodBye
 D/zkq: ProxySubject sayGoodBye end
 D/zkq: ******
 D/zkq: ProxySubject sayHello begin
 D/zkq: RealSubject sayHello  Test
 D/zkq: ProxySubject sayHello end
  • 动态代理

我们会用到InvocationHandler类,具体怎么使用,可以参考https://blog.csdn.net/yaomingyang/article/details/80981004

在这里我们实现InvocationHandler,修改invoke方法,是他调用我们传入进来的subject

public class SubjectInvocationHandler implements InvocationHandler {

    //这个就是我们要代理的真实对象
    private Object subject;


    public SubjectInvocationHandler(Object subject) {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在代理真实对象前我们可以添加一些自己的操作
        Log.d("zkq","before Method invoke");
        Log.d("zkq","Method:" + method);

        method.invoke(subject,args);

        //在代理真实对象后我们也可以添加一些自己的操作
        Log.d("zkq","after Method invoke");
        return null;
    }
}

在mainActivity中调用,我们传入SubjectInvocationHandler 中一个RealSubject,使得在调用subject.sayGoodBye()的时候,会同步调用RealSubject中的sayGoodBye

   public void onProxyClick(View view) {
        Subject realSubject = new RealSubject();

        SubjectInvocationHandler handler = new SubjectInvocationHandler(realSubject);

        //生成代理类
        Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),realSubject.getClass().getInterfaces(), handler);

        //输出代理类对象
        Log.d("zkq", "Proxy : " + subject.getClass().getName());
        Log.d("zkq", "Proxy super : " + subject.getClass().getSuperclass().getName());
        Log.d("zkq", "Proxy interfaces : " + subject.getClass().getInterfaces()[0].getName());
        //调用代理类sayGoodBye方法
        subject.sayGoodBye();
        Log.d("zkq", "--------");
        //调用代理类sayHello方法
        subject.sayHello("Test");
    }
  • 我们使用动态代理实现下面方法

//        Button button3 = findViewById(R.id.button3);
//        button3.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                Toast.makeText(MainActivity.this, "点击事件", Toast.LENGTH_SHORT).show();
//            }
//        });

我们动态修改onClick中的方法,使他调用mainActivity中的test()方法

   public void test(){
        Toast.makeText(this, "代理的toast", Toast.LENGTH_SHORT).show();
    }

接下来就是实现方式

首先是ListenerInvocationHandler类

public class ListenerInvocationHandler implements InvocationHandler {
    private Object activity;
    private  Method activityMethod;

    public ListenerInvocationHandler(Object activity, Method activityMethod) {
        this.activity = activity;
        this.activityMethod = activityMethod;
    }
    /**
     *按钮点下去就执行这个方法
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return activityMethod.invoke(activity);
    }
}

然后是Mainactivity中的实现方法

        try {
            //获得MainActivity中的test方法
            Method test = getClass().getMethod("test");
            //通过代理,调用当前MainActivity中的test方法
            ListenerInvocationHandler listenerInvocationHandler = new ListenerInvocationHandler(this, test);

            View.OnClickListener proxy= (View.OnClickListener)Proxy.newProxyInstance(View.OnClickListener.class.getClassLoader(), new Class[]{View.OnClickListener.class}, listenerInvocationHandler);

            //获得button03的setOnClickListener方法     View.OnClickListener.class是setOnClickListener方法的参数
            Method onClickMethod = button3.getClass().getMethod("setOnClickListener", View.OnClickListener.class);
            //执行setOnClickListener方法   button3.setOnClickListener  proxy是传入setOnClickListener中的参数
            onClickMethod.invoke(button3, proxy);
        } catch (Exception e) {
            e.printStackTrace();
        }

当点击测试代理时候就是调用的test方法中的test方法了

demo下载地址:demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android模拟器检测及对抗方法主要针对一些恶意软件或者安全测试工具会利用Android模拟器进行仿真攻击或者测试的现象进行针对性的处理。 在进行Android模拟器检测时,主要需要关注一些与真实Android设备不同的特征,例如与硬件相关的参数、系统属性或者程序运行环境等等。 对于仿真攻击的防范,可以采取识别或者拦截多次尝试注入攻击代码的恶意软件,限制模拟器的资源使用或者对模拟器的输入输出等进行限制。 同时,还可以针对模拟器本身的漏洞或者安全问题进行加强和升级,例如提高模拟器的执行效率、加强其隔离能力和安全控制等等,以提高其整体的安全性和稳定性。 总之,针对Android模拟器的检测与对抗是一个不断发展的过程,需要综合运用安全技术和策略手段来保障Android系统的安全和稳定性。 ### 回答2: 随着Android开发工具的不断完善,现今已经出现了许多神经网络和机器学习模型,这些都是建立在手机设备的真实运行平台上的。因此,检测和对抗模拟器成为保护应用软件安全和用户隐私的重要一步。在下面的内容中,将就Android模拟器检测及对抗方法进行简要说明。 检测方法 如何检测模拟器就可以通过检测特定的硬件规范的方式来进行。通过检测设备的Sim卡号、IMEI、MAC地址等硬件定义能力,以此来进行模拟器的检测。此外,还有一些开源的用于检测模拟器的工具,例如Anti-Emulator、J2Android等。 对抗方法 对于安卓模拟器检测的对抗方法,主要可以从以下几个方面来进行: (1)虚拟机检测绕过 在模拟器中检查与真实设备硬件参数相同的数据,以绕过检测,提高识别难度。此外还可以使用XPOSED框架,来使硬件参数信息看上去更加真实。 (2)操作系统绕过 使用修改后的ROM来绕过对模拟器的检测。例如,Genymotion和AndroVM权限更高的虚拟化环境,同时支持模拟不同版本的Android。 (3)应用层绕过 可以通过模拟器操作系统中不可见的或者不常用的系统调用来绕过检测。此外,还可以通过代理或反向代理技术来绕过复杂的脚本或网络检测。 总之,基于某种检测方式设计的对抗方法是不固定的;因此,开发人员要考虑多种检测模拟器的方法,进行合理的应对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值