文章标题

    xiaoxiao2021-08-23  100

    1. ** Android IOC框架实现 =============== ** 本文简单介绍下如何实现编译期注解 介绍编译期注解,首先得介绍下如下两个注解 Target注解的功能就是表明你这个注解是用在什么地方的,它的值是一个枚举型   1.CONSTRUCTOR:用于描述构造器     2.FIELD:用于描述域     3.LOCAL_VARIABLE:用于描述局部变量     4.METHOD:用于描述方法     5.PACKAGE:用于描述包     6.PARAMETER:用于描述参数     7.TYPE:用于描述类、接口(包括注解类型) 或enum声明 Retention注解的功能差不多说明的就是你的注解的生命周期吧,就是什么时候失效,它的值如下 1.SOURCE:在源文件中有效(即源文件保留)     2.CLASS:在class文件中有效(即class保留)     3.RUNTIME:在运行时有效(即运行时保留) 第一部分,实现setContentView通过注解方式实现 setContentView注解类 package movie.select.seat.ioc; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2016/11/17/017. */ @Documented //表示在运行期注解 @Retention(RetentionPolicy.RUNTIME) //表示用于描述类,枚举,接口 @Target(value=ElementType.TYPE) public @interface ContentView { //用于存放注解值的字段 int value(); } 通过注解实现setContentView功能的方法 public static void InjectView(Activity activity){ if (activity!=null){ //通过反射的方式实现注解说要实现的功能 Class<? extends Activity> cls = activity.getClass(); ContentView annotation= cls.getAnnotation(ContentView.class); int resid=annotation.value(); activity.setContentView(resid); //setContentView设置完毕,即可实现findViewbyId的注解功能 ViewInject(activity); } } 用于注解的Activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); InjectUtil.InjectView(this); InjectUtil.ViewInject(this); } 实现findViewbyId注解 findViewbyId注解类 package movie.select.seat.ioc; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2016/11/17/017. */ @Retention(RetentionPolicy.RUNTIME) //表示用于类属性注解 @Target(ElementType.FIELD) public @interface ViewInJect { int value(); } 通过注解实现findViewbyId的功能类 public static void ViewInject(Activity activity) { if (activity!=null){ Class<? extends Activity> cls = activity.getClass(); //通过反射的方式来获取该类中所有的属性字段 Field[] f=cls.getFields(); for (Field c: f){ //遍历所有属性字段,过滤出有ViewInJect的字段 if (c.isAnnotationPresent(ViewInJect.class)){ c.setAccessible(true); ViewInJect inject=c.getAnnotation(ViewInJect.class); try { //将通过findViewbyId获取来的View通过反射的方式赋值 c.set(activity,activity.findViewById(c.getAnnotation(ViewInJect.class).value())); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } 使用findViewbyId注解的Activity package movie.select.seat.ioc; import android.os.Bundle; import android.widget.Button; import android.widget.Toast; @ContentView(R.layout.activity_main) public class MainActivity extends BaseActivity { @ViewInJect(R.id.btn) Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); InjectUtil.InjectView(this); InjectUtil.ViewInject(this); Toast.makeText(this,btn.getText().toString(),Toast.LENGTH_LONG).show(); } } 点击事件注解 点击事件注解类 package movie.select.seat.ioc; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2016/11/17/017. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface OnClick { int[] value(); } 点击事件注解使用方法 public static void setClick(final Activity activity){ Class<? extends Activity> cls = activity.getClass(); Method[] method = cls.getMethods(); for (final Method m :method){ if (m.isAnnotationPresent(OnClick.class)){ OnClick click=m.getAnnotation(OnClick.class); int[] ids=click.value(); for (int i : ids){ View view=activity.findViewById(i); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { m.invoke(activity,view); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }); } } } 点击事件使用Activity @OnClick(R.id.btn) public void click(View view){ Toast.makeText(this,"1111",Toast.LENGTH_LONG).show(); }
    转载请注明原文地址: https://ju.6miu.com/read-676910.html

    最新回复(0)