日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 通过 annotation ViewInject

發布時間:2025/6/15 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 通过 annotation ViewInject 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

?通常對控件的獲取對象是通過sourceView.findViewById(R.id.xx)。通過獲取控件的中的注解形式實現一些控件對象。

如:

[java]?view plaincopy
  • @ViewInject(id=R.id.text_title)??
  • TextView?text_title;??
  • ??
  • @ViewInject(id=R.id.button,click="btnOk")??
  • Button?button;??

  • 1、注解對象創建

    [java]?view plaincopy
  • import?java.lang.annotation.ElementType;??
  • import?java.lang.annotation.Retention;??
  • import?java.lang.annotation.RetentionPolicy;??
  • import?java.lang.annotation.Target;??
  • ??
  • @Target(ElementType.FIELD)??
  • @Retention(RetentionPolicy.RUNTIME)??
  • public?@interface?ViewInject?{??
  • ????public?int?id();??
  • ????public?String?click()?default?"";??
  • }??

  • 2、通過反射獲取控件對象,并且設置控件對象上面設置的點擊事件

    [java]?view plaincopy
  • import?java.lang.reflect.Field;??
  • import?java.lang.reflect.InvocationTargetException;??
  • import?java.lang.reflect.Method;??
  • import?java.util.EventListener;??
  • ??
  • import?android.app.Activity;??
  • import?android.view.View;??
  • import?android.view.View.OnClickListener;??
  • ??
  • public?class?ViewInjectUtil?{??
  • ??????public?static?void?initViewInject(Activity?activity)?{??
  • ????????????initViewInject(activity,?activity.getWindow().getDecorView());??
  • ????????}??
  • ??
  • ????????private?static?void?initViewInject(final?Object?injectedSourse,??
  • ???????????????????????????????????????????View?sourceView)?{??
  • ????????????Field[]?fields?=?injectedSourse.getClass().getDeclaredFields();??
  • ????????????if?(fields?!=?null?&&?fields.length?>?0)?{??
  • ????????????????for?(Field?field?:?fields)?{??
  • ????????????????????try?{??
  • ????????????????????????//?設置為true?可以訪問屬性中的私有變量??
  • ????????????????????????field.setAccessible(true);??
  • ????????????????????????if?(field.get(injectedSourse)?!=?null)?{??
  • ????????????????????????????continue;??
  • ????????????????????????}??
  • ????????????????????????ViewInject?mViewInject?=?field??
  • ????????????????????????????????.getAnnotation(ViewInject.class);??
  • ????????????????????????if?(mViewInject?!=?null)?{??
  • ????????????????????????????int?viewId?=?mViewInject.id();??
  • ????????????????????????????field.set(injectedSourse,??
  • ????????????????????????????????????sourceView.findViewById(viewId));??
  • ????????????????????????????Object?obj?=?field.get(injectedSourse);??
  • ????????????????????????????if?(obj?instanceof?View)?{??
  • ????????????????????????????????setMethodOnClick(obj,injectedSourse,mViewInject.click());??
  • ??
  • ??
  • ????????????????????????????}??
  • ??
  • ????????????????????????}??
  • ??
  • ????????????????????}?catch?(Exception?e)?{??
  • ????????????????????????//?TODO:?handle?exception??
  • ????????????????????}??
  • ??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????}??
  • ??
  • ????????private?static?void?setMethodOnClick(Object?obj,?final?Object?injectedSourse,String?methodName)?{??
  • ????????????final?Method?method?;??
  • ????????????try?{??
  • ????????????????method?=?injectedSourse.getClass()??
  • ???????????????????????.getDeclaredMethod(methodName,??
  • ???????????????????????????????View.class);??
  • ????????????????((View)?obj)??
  • ????????????????????????.setOnClickListener(new?OnClickListener()?{??
  • ??
  • ????????????????????????????@Override??
  • ????????????????????????????public?void?onClick(View?v)?{??
  • ????????????????????????????????try?{??
  • ????????????????????????????????????method.invoke(injectedSourse,?v);??
  • ????????????????????????????????}?catch?(IllegalAccessException?e)?{??
  • ????????????????????????????????????//?TODO?Auto-generated?catch??
  • ????????????????????????????????????//?block??
  • ????????????????????????????????????e.printStackTrace();??
  • ????????????????????????????????}?catch?(IllegalArgumentException?e)?{??
  • ????????????????????????????????????//?TODO?Auto-generated?catch??
  • ????????????????????????????????????//?block??
  • ????????????????????????????????????e.printStackTrace();??
  • ????????????????????????????????}?catch?(InvocationTargetException?e)?{??
  • ????????????????????????????????????//?TODO?Auto-generated?catch??
  • ????????????????????????????????????//?block??
  • ????????????????????????????????????e.printStackTrace();??
  • ????????????????????????????????}??
  • ????????????????????????????}??
  • ????????????????????????});??
  • ????????????}?catch?(NoSuchMethodException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ??
  • ????????}??
  • }??

  • 3、Demo演示

    [java]?view plaincopy
  • public?class?MainActivity?extends?Activity?{??
  • ??
  • ????@ViewInject(id=R.id.text_title)??
  • ????TextView?text_title;??
  • ??????
  • ????@ViewInject(id=R.id.button,click="btnOk")??
  • ????Button?button;??
  • ??????
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ????????ViewInjectUtil.initViewInject(MainActivity.this);??
  • ??????????
  • ??
  • ??????????
  • ????}??
  • ????public?void?btnOk(View?v){??
  • ????????text_title.setText("text?set?form?button");??
  • ?????}??
  • ??
  • ??
  • }??

  • 總計:

    本節的代碼參考了?https://github.com/yangfuhai/afinal 中實現的Code

    反射的詳細Demo?

    參考:http://my.oschina.net/zc741520/blog/195460

    [java]?view plaincopy
  • package?demo.reflect;??
  • ??
  • import?java.lang.reflect.*;??
  • ??
  • public?class?ReflectDemo?{??
  • ??
  • ????/**?
  • ?????*?為了看清楚Java反射部分代碼,所有異常我都最后拋出來給虛擬機處理?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?throws?ClassNotFoundException,?IllegalAccessException,?InstantiationException,?InvocationTargetException,?NoSuchFieldException,?NoSuchMethodException?{??
  • ??
  • ????????System.out.println("demo1:通過Java反射機制得到類的包名和類名");??
  • ????????demo1();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo2:驗證所有的類都是Class類的實例對象");??
  • ????????demo2();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo3:通過Java反射機制,用?Class?創建類對象,這也就是反射存在的意義所在");??
  • ????????demo3();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo4:通過Java反射機制得到一個類的構造函數,并實現創建帶參實例對象");??
  • ????????demo4();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo5:通過Java反射機制操作成員變量,?set?和?get");??
  • ????????demo5();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo6:通過Java反射機制得到類的一些屬性:繼承的接口、父類、函數信息、成員信息、類型等");??
  • ????????demo6();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo7:通過Java反射機制調用類方法");??
  • ????????demo7();??
  • ??
  • ????????System.out.println("");??
  • ????????System.out.println("demo8:通過Java反射機制得到類加載器信息");??
  • ????????demo8();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo1:通過Java反射機制得到類的包名和類名?
  • ?????*/??
  • ????public?static?void?demo1()?{??
  • ????????Person?person?=?new?Person();??
  • ????????System.out.println("包名:"?+?person.getClass().getPackage().getName());??
  • ????????System.out.println("完整類名:"?+?person.getClass().getName());??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo2:驗證所有的類都是Class類的實例對象?
  • ?????*/??
  • ????public?static?void?demo2()?throws?ClassNotFoundException?{??
  • ????????//定義兩個類型都未知的Class,設置初值為null,看看如何給它們賦值成Person類??
  • ????????Class<?>?class1?=?null;??
  • ????????Class<?>?class2?=?null;??
  • ????????//寫法1,可能拋出?ClassNotFoundException?異常,多用這個寫法??
  • ????????class1?=?Class.forName("demo.reflect.Person");??
  • ????????System.out.println("寫法1,包名:"?+?class1.getPackage().getName()?+?"?,?完整類名:"?+?class1.getName());??
  • ????????//寫法2??
  • ????????class2?=?Person.class;??
  • ????????System.out.println("寫法2,包名:"?+?class2.getPackage().getName()?+?"?,?完整類名:"?+?class2.getName());??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo3:通過Java反射機制,用?Class?創建類對象,這也就是反射存在的意義所在?
  • ?????*/??
  • ????public?static?void?demo3()?throws?ClassNotFoundException,?InstantiationException,?IllegalAccessException?{??
  • ????????Class<?>?class1?=?null;??
  • ????????class1?=?Class.forName("demo.reflect.Person");??
  • ????????//由于這里不能帶參數,所以你要實例化的這個類Person,一定要有無參構造函數??
  • ???????/*?Person?person?=?(Person)?class1.newInstance();?
  • ????????person.setName("xiaoming");?
  • ????????person.setAge(20);?
  • ????????System.out.println(person.getName()?+?"?,?"?+?person.getAge());*/??
  • ??????????
  • ????????Person?person=(Person)?Class.forName("demo.reflect.Person").newInstance();??
  • ????????person.setAge(30);??
  • ????????person.setName("wang");??
  • ????????System.out.println(person.getAge()+"??"+person.getName());??
  • ????}??
  • ??
  • ????/**????
  • ?????*?demo4:通過Java反射機制得到一個類的構造函數,并實現創建帶參實例對象?
  • ?????*/??
  • ????public?static?void?demo4()?throws?ClassNotFoundException,?InstantiationException,?IllegalAccessException,?IllegalArgumentException,?InvocationTargetException?{??
  • ????????Class<?>?class1?=?null;??
  • ????????Person?person1?=?null;??
  • ????????Person?person2?=?null;??
  • ??
  • ????????class1?=?Class.forName("demo.reflect.Person");??
  • ????????Constructor<?>[]?constructors?=?class1.getConstructors();??
  • ??
  • ????????person1?=?(Person)?constructors[0].newInstance();??
  • ????????person1.setName("xiaoming");??
  • ????????person1.setAge(20);??
  • ????????System.out.println(person1.getName()?+?"?,?"?+?person1.getAge());??
  • ????????person2?=?(Person)?constructors[1].newInstance(21,?"xiaohong");??
  • ????????System.out.println(person2.getName()?+?"?,?"?+?person2.getAge());??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo5:通過Java反射機制操作成員變量,?set?和?get?
  • ?????*/??
  • ????public?static?void?demo5()?throws?ClassNotFoundException,?IllegalAccessException,?InstantiationException,?NoSuchFieldException,?SecurityException?{??
  • ????????Class<?>?class1?=?Class.forName("demo.reflect.Person");??
  • ????????Object?obj?=?class1.newInstance();??
  • ????????Field?personNameField?=?class1.getDeclaredField("name");??
  • ????????personNameField.setAccessible(true);?//取消訪問檢查??
  • ????????personNameField.set(obj,?"小虎");??
  • ????????System.out.println("修改屬性之后得到屬性變量的值:"?+?personNameField.get(obj));??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo6:通過Java反射機制得到類的一些屬性:繼承的接口、父類、函數信息、成員信息、類型等?
  • ?????*/??
  • ????public?static?void?demo6()?throws?ClassNotFoundException?{??
  • ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");??
  • ??
  • ????????//取得父類名稱??
  • ????????Class<?>?superclass?=?class1.getSuperclass();??
  • ????????System.out.println("SuperMan類的父類名:"?+?superclass.getName());??
  • ??
  • ????????Field[]?fields?=?class1.getDeclaredFields();??
  • ????????for?(int?i?=?0;?i?<?fields.length;?i++)?{??
  • ????????????System.out.println("類中的成員"?+?i?+?":?"?+?fields[i]);??
  • ????????}??
  • ??
  • ????????//取得類方法??
  • ????????Method[]?methods?=?class1.getDeclaredMethods();??
  • ????????for?(int?i?=?0;?i?<?methods.length;?i++)?{??
  • ????????????System.out.println("取得SuperMan類的方法"?+?i?+?":");??
  • ????????????System.out.println("函數名:"?+?methods[i].getName());??
  • ????????????System.out.println("函數返回類型:"?+?methods[i].getReturnType());??
  • ????????????System.out.println("函數訪問修飾符:"?+?Modifier.toString(methods[i].getModifiers()));??
  • ????????????System.out.println("函數代碼寫法:?"?+?methods[i]);??
  • ????????}??
  • ??
  • ????????//取得類實現的接口,因為接口類也屬于Class,所以得到接口中的方法也是一樣的方法得到哈??
  • ????????Class<?>?interfaces[]?=?class1.getInterfaces();??
  • ????????for?(int?i?=?0;?i?<?interfaces.length;?i++)?{??
  • ????????????System.out.println("實現的接口類名:?"?+?interfaces[i].getName());??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo7:通過Java反射機制調用類方法?
  • ?????*/??
  • ????public?static?void?demo7()?throws?ClassNotFoundException,?NoSuchMethodException,?IllegalAccessException,?InstantiationException,?InvocationTargetException?{??
  • ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");??
  • ??
  • ????????System.out.println("調用無參方法fly():");??
  • ????????Method?method?=?class1.getMethod("fly");??
  • ????????method.invoke(class1.newInstance());??
  • ??
  • ????????System.out.println("調用有參方法walk(int?m):");??
  • ????????method?=?class1.getMethod("walk",?int.class);??
  • ????????method.invoke(class1.newInstance(),?100);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?demo8:通過Java反射機制得到類加載器信息?
  • ?????*?在java中有三種類類加載器?
  • ?????*?1)Bootstrap?ClassLoader?此加載器采用c++編寫,一般開發中很少見。?
  • ?????*?2)Extension?ClassLoader?用來進行擴展類的加載,一般對應的是jre\lib\ext目錄中的類?
  • ?????*?3)AppClassLoader?加載classpath指定的類,是最常用的加載器,同時也是java中默認的加載器。?
  • ?????*/??
  • ????public?static?void?demo8()?throws?ClassNotFoundException?{??
  • ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");??
  • ????????String?name?=?class1.getClassLoader().getClass().getName();??
  • ????????System.out.println("類加載器類名:"?+?name);??
  • ????}??
  • ??
  • }??
  • ??
  • class?Person?{??
  • ????private?int?age;??
  • ????private?String?name;??
  • ??
  • ????public?Person()?{??
  • ??
  • ????}??
  • ??
  • ????public?Person(int?age,?String?name)?{??
  • ????????this.age?=?age;??
  • ????????this.name?=?name;??
  • ????}??
  • ??
  • ????public?int?getAge()?{??
  • ????????return?age;??
  • ????}??
  • ??
  • ????public?void?setAge(int?age)?{??
  • ????????this.age?=?age;??
  • ????}??
  • ??
  • ????public?String?getName()?{??
  • ????????return?name;??
  • ????}??
  • ??
  • ????public?void?setName(String?name)?{??
  • ????????this.name?=?name;??
  • ????}??
  • }??
  • ??
  • interface?ActionInterface?{??
  • ????public?void?walk(int?m);??
  • }??
  • ??
  • class?SuperMan?extends?Person?implements?ActionInterface?{??
  • ????private?boolean?blueBriefs;??
  • ??
  • ????public?void?fly()?{??
  • ????????System.out.println("超人會飛耶~~");??
  • ????}??
  • ??
  • ????public?boolean?isBlueBriefs()?{??
  • ????????return?blueBriefs;??
  • ????}??
  • ??
  • ????public?void?setBlueBriefs(boolean?blueBriefs)?{??
  • ????????this.blueBriefs?=?blueBriefs;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?walk(int?m)?{??
  • ????????System.out.println("超人會走耶~~走了"?+?m?+?"米就走不動了!");??
  • ????}??
  • } ?
  • 總結

    以上是生活随笔為你收集整理的Android 通过 annotation ViewInject的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲伦理一区二区 | 日韩国产毛片 | 中文无码熟妇人妻av在线 | 在线成人黄色 | 亚洲视频在线看 | 精品国产欧美 | 夜夜嗨av一区二区 | 日韩中文字幕久久 | aaa一级黄色片 | 日韩精品在线观看一区二区 | 午夜精品久久久久久毛片 | 黄色小视频网 | 欧美男人操女人 | 日韩一区二区免费在线观看 | 日韩人妻一区二区三区蜜桃视频 | 精品久久中文 | 刘玥91精选国产在线观看 | 日韩欧美国产成人 | 欧美va天堂 | 国产精品久久久久永久免费看 | 久久一精品 | 精品国模一区二区三区欧美 | 日日夜夜草 | 色播五月激情五月 | 亚洲国产综合久久 | 日本黄色xxx | 自拍偷拍激情 | 久久人人爽人人爽人人片av高清 | 国内精品99| 亚洲色图二区 | 男男车车的车车网站w98免费 | 黄色片视频免费 | 在线观看波多野结衣 | 强行挺进皇后紧窄湿润小说 | 日韩亚洲欧美在线观看 | 免费大片黄在线观看 | 少妇搡bbbb搡bbb搡打电话 | 亚洲国产精品99久久 | 91丝袜呻吟高潮美腿白嫩在线观看 | 国产成人精品一区二区三区网站观看 | 都市激情亚洲色图 | 一级免费在线观看 | 噜噜啪啪 | 夜夜操网址 | 靠逼动漫 | 色屁屁在线 | 美女校花脱精光 | 国产无码精品久久久 | 欧美精品在线观看 | 麻豆乱淫一区二区三区 | 黑人巨茎大战欧美白妇 | 在线观看免费国产 | 亚洲精品视频91 | 中国一级片在线观看 | 亚洲视频在线免费 | 久久精品欧美日韩精品 | 免费在线观看成人 | 欧洲av网站 | 亚洲欧美日韩国产成人精品影院 | 91精品国产综合久久福利软件 | 性做久久久| 亚洲精品久久久久久久蜜桃 | 一区二区国产精品视频 | 夜夜嗨av禁果av粉嫩av懂色av | 高潮流白浆在线观看 | 丰满护士巨好爽好大乳 | 热热色av | 午夜视频在线瓜伦 | 成人在线观看一区 | 亚洲一区视频在线播放 | 99黄色片| 精品人妻一区二区三区日产乱码 | 国产成人久久婷婷精品流白浆 | 日韩成人黄色片 | 亚洲区av| 国产深喉视频一区二区 | 毛片一级免费 | 国产性爱精品视频 | hs网站在线观看 | 无码人妻一区二区三区精品视频 | www在线视频 | 日本一二三区在线视频 | 色悠悠久久综合 | 亚欧洲精品在线视频免费观看 | 欧美日韩精品一二三区 | 欧美国产成人精品一区二区三区 | 欧美午夜精品久久久久久人妖 | 亚洲av无码一区二区二三区 | 天天操夜夜操 | 插插插综合视频 | 欧美黄色小视频 | 丰满肥臀噗嗤啊x99av | 成年人的毛片 | 日韩中文字幕亚洲精品欧美 | 肉丝袜脚交视频一区二区 | 九九精品网 | 亚洲av人人澡人人爽人人夜夜 | 色综合a| 欧美性猛交xxxx免费看久久久 |