java基础 注解 android中的实现

先贴实现的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();
                }
            }
        }
    }
时间: 2024-08-01 21:09:08

java基础 注解 android中的实现的相关文章

【转载】Java基础之String中equals,声明方式,等大总结

转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识点还是比较多的.今天就和大家来一起讨论一下,关于String的一些容易让人疑惑的地方,废话不多说进入正题...如有谬误请批评指正,如果有疑问请留言.我会在第一时间修改或回答 通过

JAVA回调函数ANDROID中典型的回调地方

在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序员阿祥写了一段程序(CallPerson)其中有回调函数的接口(PhoneCall),并且封装好了程序(CallPerson).程序员阿呆写了程序(MumCall)要让 阿祥写的程序(CallPerson)调用阿呆写的程序(MumCall)中的方法.于是阿祥的程序(CallPerson)通过程序中(

Java简单模拟Android中Handler-Message机制

在Android中主线程与子线程的通信十分重要,Google工程师为我们提供了Handler-Message机制来解决他们之间的交互问题.今天,我们就来简单理解Handler-Message机制的原理,在Java中简单模拟该机制.代码示例Github地址HandlerDemo 首先,看一下简单流程图(不太专业) 由上图可知,流程中主要相关类有Handler.Message.MessageQueue.Looper:下面,我们就围绕它们来简单分析该流程图: 1.我们一般在主线程创建Handler,接

[安卓基础] 008.Android中的显示单位

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

[Android基础]Android中使用HttpURLConnection

HttpURLConnection继承了URLConnection,因此也能够向指定站点发送GET请求.POST请求.它在URLConnetion的基础上提供了例如以下便捷的方法. int getResponseCode():获取server的响应代码. String getResponseMessage():获取server的訪问信息. String getRequestMethod():获取发送请求的方法. void setRequestMethod(String method):设置发送请

java基础-注解Annotation原理和用法

在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为java平台很重要的一部分了,很多的框架程序中也喜欢使用注解,如Spring.Mybatis等. 那么,什么是注解呢?注解就是元数据,一种描述数据的数据,通俗一点就是为程序的元素(类.方法.成员变量)加上更直观的说明,这些说明信息是与程序的业务逻辑无关的.但是,我们可以通过java的反射机制来获取An

Java基础——注解

一.概述 引自百度百科: 定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释. 二.JDK内置注解 Java提供了三种内建注解. 1. @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法.这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息. 2. @Depr

Java反射在Android中的使用

转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606687.html 做Java开发或者安卓开发的同学经常都会遇到这样一个问题,如果我们想调用A类里面的一个私有方法B,然后在C类中使用.通常的直接调用方法是行不通的.也有人说那就把私有的变为公有的就完事了呗,但是凡事都有解决方案,不用改为公有. 进入正题: 有这样一段代码 public class MainActivity extends AppCompatActivity { @Override p

JAVA基础篇NO2--Java中的基本命名规则及数据类型

1.Java中的常量及进制 1.常量: 在程序运行的过程中,不可以改变的量,就是常量 boolean类型的值只能是true或者false null: 空常量, 代表不存在! ---------------------------以下是了解的内容----------------------------------- 2.进制:(了解) 常见进制: 二进制,八进制,十进制,十六进制 进制的表现形式: 二进制: 以0b开头 八进制: 以0开头 十六进制: 以0x开头 进制转换: 任意进制转成十进制: