您的位置:首页 > 其它

反射注解浅引

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(); } } } }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: