位置: 编程技术 - 正文

Android注入框架你应该知道的一切------打造自己的注入框架(android注入so)

编辑:rootadmin
前言

推荐整理分享Android注入框架你应该知道的一切------打造自己的注入框架(android注入so),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android 注入,android 注入js代码,安卓apk注入器,android 注入,android注解框架,android inject注入,安卓注入框架,android注解框架,内容如对您有帮助,希望把文章链接给更多的朋友!

2. 注解简介

3. 关于注入框架你应该知道的一切

1. 打造自己的注入框架

1. View的注入

2. 事件的注入

前言

Java的所有框架基本都是基于反射的,所以有句话是这么说的,无反射,无框架。所以Android的注入框架也是基于反射的,接下来就简单的介绍一下Android的注入框架你应该知道的一切。

注解简介

注解(Annotation)在Java里面是比较重要的一部分,但是通常很少接触到这一部分,这里就简单的过一下。现在我们简单的写一个注解然后解释它。通过Eclipse右键->New->Annotation然后敲入下面的代码。

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface TestAnnotation

{

int vauls();

String test();

}

可以看到Target这个标注我们定义为FIELD就是类里面的属性的意思,Retention这个标注是表示是运行时的注解。每个注解的意思大家可以收一下自己看看。然后看看我们怎么使用这个注解。我们随便在某一个类里面声明一个对象。如下

@TestAnnotation(test="hello",vauls=)

private Buttonbutton3;

这样就声明好了我们的注解。然后就是注解的使用。也简单的看一下怎么使用的。

Class<?> clas = getClass();

//获取属性

Field fields[] =clas.getDeclaredFields();

for (Fieldfield : fields)

{

//获取注解

TestAnnotation testAnnotation =field.getAnnotation(TestAnnotation.class);

if (testAnnotation!= null)

{

//得到注解里面的&#;

String test =testAnnotation.test();

int id =testAnnotation.vauls();

System.out.println(test&#; id);

}

}

就这样简单的使用,如果需要深入的理解注解可以在查一下注解的资料。

关于注入框架你应该知道的一切

打造自己的注入框架

首先说一下我们这次要实现怎么样的一个东西,注入View和注入Onclick事件,首先我们先解决注入View的问题.

View的注入

首先我们还是新建一个注解,敲入以下代码。

package com.edsheng.inject;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/***

* Copyright (c), TNT All Rights Reserved.

* View注解在声明VIew控件的时候进行注解就行了

* @author bobo

* @date -6-9

* @filenameViewInject.java

*

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ViewInject

{

int value();

}

然后我们在新建一个ViewInjectUtile类,在里面实现这样的一个方法。

/***

* 注入控件View

* 简单说一下注入控件的流程

* 1:根据Filed遍历所有的Filed

* 2:得到我们需要的注解

* 3:根据注解拿到id

* 4:通过反射去调用找查方法

* 5:最后通过反射赋&#;

*

* @paramactivity

*/

private static void injectView(Activity activity)

{

Class<?> cls =activity.getClass();

Field field[] =cls.getDeclaredFields();// 获取所有的filed

for (Fieldfield2 : field)

{

ViewInject inject =field2.getAnnotation(ViewInject.class);// 获取注解

if (inject != null)

{

int id =inject.value(); // 得到id

try

{

// findViewById

Method method =cls.getMethod("findViewById", int.class);

Object resView =method.invoke(activity, id);// 得到控件

field2.setAccessible(true);

field2.set(activity,resView);// 赋&#;给View

}

catch (Exceptione)

{

e.printStackTrace();

}

}

}

}

注释都写的很清楚我就不解释了,这样就很简单的实现了View的注入,使用也很简单。

事件的注入

我们还是新建一个注解来完成我们的事件注入,敲入以下代码。

/***

*

* Copyright (c), TNT All Rights Reserved.

* 方法的注解类在需要回调OnlickLisenler的时候进行注解就行了

*

* @author bobo

* @date -6-9

* @filenameMethodInject.java

*

*/

@Target(ElementType.METHOD)

Android注入框架你应该知道的一切------打造自己的注入框架(android注入so)

@Retention(RetentionPolicy.RUNTIME)

public @interface MethodInject

{

int[] value();

}

然后在ViewInjectUtile这个类里面实现这样一个方法。

/**

* 注入监听的方法 所有的框架基本都是基于反射来实现的,不是有一句话么?无反射无框架。

* 简单的说一下这个流程

* 1:在我们的acitvity里面注入方法

* 2:生成动态代理

* 3:通过东动态代理去回调我们注入的方法

*

* @paramactivity

*/

private static void injectMethod(Activity activity)

{

Class<?> cls =activity.getClass();

Method methods[] = cls.getMethods();// 获取这个类的public方法

for (Methodmethod : methods)

{

MethodInject meathdInject =method.getAnnotation(MethodInject.class); // 获取方法上的注解

if (meathdInject != null)

{// 当有注解的时候生成动态代理

Object proxy = (Object)Proxy.newProxyInstance(View.OnClickListener.class.getClassLoader(), new Class<?>[] { View.OnClickListener.class }, newDynaHanlder(activity, method));

int ids[] =meathdInject.value();// 获取注解里面的id

try

{

Method findviewbyid =cls.getMethod("findViewById", int.class);// 得到方法

for (int id : ids)

{

Object view =findviewbyid.invoke(activity, id);// 根据方法获取view

Method onclickMethod =view.getClass().getMethod("setOnClickListener", View.OnClickListener.class);

onclickMethod.invoke(view, proxy);// 调用setOnClickListener方法回调在动态类里面

}

}

catch (Exceptione)

{

e.printStackTrace();

}

}

}

}

这里需要注意的就是动态类的生成和代理,我们把View.OnClickListener这个的接口通过代理和反射来回调给注解的地方,我们来看看这个DynaHanlder怎么实现的。

public static class DynaHanlder implementsInvocationHandler

{

Object target = null;

Method method = null;

public DynaHanlder(Object target, Method method)

{

super();

this.target =target;

this.method =method;

}

/**

* 这个函数就是动态注册的回调方法

*/

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

{

// 这里调用动注入的方法

return this.method.invoke(target, args);

}

}

也很简单就是保持我们的方法的应用当通过代理回调我们的时候我们也通过反射去调用我们的方法。 最后再给外部暴露一个接口方法。

//外部调用接口

static public void inject(Activityactivity)

{

injectView(activity);

injectMethod(activity);

}

最后来看看我们怎么使用它吧。

public class MainActivity extends Activity

{

@ViewInject(R.id.button)

private Button button;

@ViewInject(R.id.button2)

private Button button2;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.mainactivity);

ViewInjectUtile.inject(this);

button.setText("fuck");

button2.setText("asdfasdf");

}

@MethodInject({ R.id.button, R.id.button2 })

public void onClick(View v)

{

switch(v.getId())

{

caseR.id.button:

// System.out.println("asdfasdf");

Toast.makeText(this, "R.id.button", 0).show();

break;

caseR.id.button2:

Toast.makeText(this, "R.id.button2", 0).show();

// System.out.println("asdf");

break;

default:

break;

}

}

当点击按钮会回调我们的方法,注入一开始就帮我们完成了id与控件的绑定,这就是注入框架主要的精髓了,需要更好更强大的框架还需要自己慢慢完成。这里贴上源代码地址:传送门

[置顶] Android项目页面跳转小Demo 最近在做Android项目的开发,刚刚接触会有很多新东西需要学习,从环境的搭建到语言的熟悉都是需要一步步完成的,接下来就拿一个页面跳转的例子来

Android NDK 引用第三方.so库到lib下 问题:当编译ndk项目的时候,eclipse会自动删除lib/armeabi目录下的so库。每次都要重新把第三方的so库文件要重新粘贴进去。解决办法:1、在JNI文件夹下建

Android alertDialog 动态添加edittext无法弹出键盘解决方案 严来说这也不算是原创了,因为项目的原因需要在alertDialog根据spinner的选项动态生成控件,其中遇到一个恶心的问题,创建的edittext无法弹出键盘输入,

标签: android注入so

本文链接地址:https://www.jiuchutong.com/biancheng/386715.html 转载请保留说明!

上一篇:android MediaPlayer 简记(Android mediaplayer 白屏)

下一篇:[置顶] Android项目页面跳转小Demo([置顶]电影名字《收件人不详》)

  • 月薪3万个人所得税是多少
  • 借款合同印花税怎么申报
  • 企业的承兑汇票贴息很高说明什么
  • 用友T3怎么结转上年数据
  • 转让股权取得的收益是调增还是调减
  • 多交的应交税费怎么算
  • 其他应付为负数怎么处理
  • 进口缴纳关税
  • 营改增后企业所得税不能跨年
  • 工程发票备注怎么写
  • 企业上市过程中遇到的困难
  • 税务要求企业所得税预缴申报更正
  • 非房地产开发企业土地增值税扣除项目
  • 普票需要缴纳印花税吗
  • 资产评估入账的评估报告
  • 企业公益捐赠的意义
  • Mac怎么强制关闭程序
  • 企业所得税调增调减项目比例
  • 销售环节的运费怎么算
  • 交罚金怎么交
  • 王者荣耀干将莫邪技能
  • 如何一键重装系统win10
  • 房东压我押金怎么办
  • 销售返点的账务怎么处理
  • 什么是集成显卡长什么样
  • php中strrev
  • 工业企业采购部门职责
  • 银行的抵债资产有几种处置办法
  • 优酷路由宝还有用吗
  • 最薄的电视机是多厚
  • 拉马克是哪国人
  • Sandilands省级森林中被白霜覆盖的番红花,加拿大曼尼托巴 (© Jaynes Gallery/Danita Delimont)
  • 即征即退增值税怎么申报
  • 小规模纳税人缴税的分录
  • 企业和银行未达账项
  • 支付银行手续费等直接收费金融服务
  • 业务招待费包括哪些内容和费用
  • 关于低值易耗品的说法中不正确的是
  • 当月注销外管证个税账户也会注销吗
  • sqlserver正则表达式用法
  • 营业外支出的内容包括
  • 应交税费需要结转到本年利润吗
  • 财产租赁合同印花税双方都要交吗
  • 在创业板上市公司首次公开发行股票的条件
  • 免税企业税金及附加计算
  • 以前年度损益调整属于哪类科目
  • 对公账户给别人走账
  • 坏账准备计提要求
  • 涉税信息声明怎么提供
  • 工程未完工开了发票怎么做账
  • 盈利能力分析对企业发展的意义
  • 合同权利义务包含债务吗
  • 收到加盟费怎么开票入账
  • 代金券消费怎么入账
  • 实报实销有补贴嘛
  • 不得从销项税额中抵扣进项税的有哪些
  • 差旅费住宿专票能否抵扣
  • sql server数据库中的null(空值)
  • sql server随机数函数
  • mysql 5.7.18 winx64密码修改
  • centos 7.5 7.6
  • win8支持固态硬盘吗
  • 电脑如何安装Anaconda
  • 装双win7系统怎么设置
  • win7怎么开不了机
  • win10 功能
  • 为了保证系统安全,必须为用户和角色设置密码
  • win7系统重装后蓝屏
  • javascript Ext JS 状态默认存储时间
  • nodejs不再维护
  • 一个简单的灵魂
  • dos字符串替换
  • vue 瀑布流
  • viewpager2+fragment
  • excel password recovery5.0注册码
  • javascriptprompt用法
  • javascript中的107个基础知识收集整理 推荐
  • jquery删除dom
  • 浙江电子税务局网上开票
  • 用电稽查工作总结
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设