標籤:
先貼實現的activity的代碼:
@ContentView(R.layout.activity_main)public class MainActivity extends AppCompatActivity { @ViewInject(R.id.text_view) private TextView textView; @OnClick(R.id.text_view) private void onClick(View view){ textView.setText("我是click後的textview"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewInjectUtils.inject(this); textView.setText("我是click前的textview"); }}
ContentView(類)註解實現:
1、定義註解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ContentView { int value(); }
2、實現註解
private static void injectContentView(Activity activity) { Class<? extends Activity> clazz = activity.getClass(); ContentView contentView = clazz.getAnnotation(ContentView.class); if (contentView != null) { //如果這個activity上面存在這個註解的話,就取出這個註解對應的value值,其實就是前面說的布局檔案。 int layoutId = contentView.value(); try { Method setViewMethod = clazz.getMethod("setContentView", int.class); setViewMethod.invoke(activity, layoutId); } catch (Exception e) { e.printStackTrace(); } } }
Field註解實現
1、定義註解
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewInject { int value();}
2、實現註解
private static void injectView(Activity activity) { Class<? extends Activity> clazz = activity.getClass(); //獲得activity的所有成員變數 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //獲得每個成員變數上面的ViewInject註解,沒有的話,就會返回null ViewInject viewInject = field.getAnnotation(ViewInject.class); if (viewInject != null) { int viewId = viewInject.value(); View view = activity.findViewById(viewId); try { field.setAccessible(true); field.set(activity, view); } catch (IllegalAccessException e) { e.printStackTrace(); } } } }
介面(方法)註解實現
1、定義註解
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface OnClick { int[] value();}
2、實現註解
public class ViewInjectUtils { public static void inject(Activity activity) { injectContentView(activity); injectView(activity); injectEvent(activity); } private static void injectEvent(final Activity activity) { Class<? extends Activity> clazz = activity.getClass(); Method[] methods = clazz.getDeclaredMethods(); for (final Method method2 : methods) { OnClick click = method2.getAnnotation(OnClick.class); if (click != null) { int[] viewId = click.value(); method2.setAccessible(true); Object listener = Proxy.newProxyInstance(View.OnClickListener.class.getClassLoader(), new Class[]{View.OnClickListener.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method2.invoke(activity, args); } }); try { for (int id : viewId) { View v = activity.findViewById(id); Method setClickListener = v.getClass().getMethod("setOnClickListener", View.OnClickListener.class); setClickListener.invoke(v, listener); } } catch (Exception e) { e.printStackTrace(); } } } }
java基礎 註解 android中的實現