反射注解浅引
2017-01-11 01:05
246 查看
MainActivity:
package com.reflectanoination;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends AppCompatActivity {@ViewId(R.id.et_num)private EditText et_num;@ViewId(R.id.et_password)private EditText et_password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewUtils.infect(this);}@ViewMethod(R.id.btn)public void save(View view) {String num = et_num.getText().toString().trim();String password = et_password.getText().toString().trim();Toast.makeText(MainActivity.this, num+"------"+password, Toast.LENGTH_SHORT).show();}}
布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context=".MainActivity"><EditTextandroid:layout_margin="10dp"android:id="@+id/et_num"android:hint="狐妖小红娘"android:layout_height=[b]"50dp"android:layout_width="match_parent"/><EditTextandroid:layout_margin="10dp"android:id="@+id/et_password"android:layout_height="50dp"android:layout_width="match_parent"/><Buttonandroid:layout_margin="10dp"android:id="@+id/btn"android:layout_width="match_parent"android:layout_height="40dp"android:text="反射注解"/></LinearLayout>
字段id
package com.reflectanoination;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** Created by Administrator on 2017/1/10.*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewId {int value();}
方法id
package com.reflectanoination;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** Created by Administrator on 2017/1/10.*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewMethod {int value();}
工具类
package com.reflectanoination;import android.app.Activity;import android.view.View;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/*** Created by Administrator on 2017/1/10.*/public class ViewUtils {public static void infect(final Activity activity){final Class<? extends Activity> clazz = activity.getClass();Method[] methods = clazz.getDeclaredMethods();for (final Method method : methods) {ViewMethod viewMethod = method.getAnnotation(ViewMethod.class);if (viewMethod != null){method.setAccessible(true);int value = viewMethod.value();final View view = activity.findViewById(value);view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {findView(activity,clazz);method.invoke(activity,view);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}});}}}public static void findView(Activity activity,Class<? extends Activity> clazz){
//获取所有的字段Field[] fields = clazz.getDeclaredFields(); for (Field filed : fields){ //获得注解的对象 ViewId viewId = filed.getAnnotation(ViewId.class); if (viewId != null){ //通过注解获得值 int value = viewId.value(); View viewById = activity.findViewById(value); filed.setAccessible(true); try { filed.set(activity,viewById); } catch (IllegalAccessException e) { e.printStackTrace(); } } } }}
相关文章推荐
- php7-nginx-composer 安装laravel
- Shiro-从数据表中初始化资源和权限
- mongodb基本概念
- Ubuntu系统下解决SublimeText3中文输入
- 关于Linux下的密码输入*的问题
- 华为云使用初体验
- (找数字)HDU - 2141
- 洛谷 p1044 栈 对递归的感觉又加深了
- github常用操作
- github常用操作
- dns服务搭建
- dns服务搭建
- Leetcode Merge Intervals
- SVN与eclipse集成安装步骤_百度经验
- [24]CSS3 弹性伸缩布局(上)
- pip 更改源 pip加速
- 分析分布式服务框架
- CentOS 6.5 Install Oracle Java 8
- 【机器学习】线性回归
- jqery实现一个图标上下滑动效果