java基礎 註解 android中的實現

來源:互聯網
上載者:User

標籤:

先貼實現的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中的實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.