文档章节

Java 注解

当空皓月
 当空皓月
发布于 2016/09/05 14:33
字数 330
阅读 16
收藏 1

1、运行时注解:

http://www.yiibai.com/java/lang/package_getannotation.html

ViewInject .java:

package com.flx.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 
 * @Description: 自定义view注解类
 * @date 2016-9-5 上午11:52:04
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
	int value();
}

InjectUtil.java: 

package com.flx.annotation;

import java.lang.reflect.Field;

import android.app.Activity;
import android.view.View;

/**
 * 
 * @Description:
 * @date 2016-9-5 上午11:59:06
 */
public class InjectUtil {

	public static void inject(View view, boolean isSuperClass) {
		injectObj(view, isSuperClass);
	}

	public static void inject(Activity activity, boolean isSuperClass) {
		injectObj(activity, isSuperClass);
	}

	/**
	 * 
	 * @Description: 获取object上的所有注解字段,并获取注解上的值,设置字段的值为查找到的view
	 * @param object
	 */
	private static void injectObj(Object object, boolean isSuperClass) {
		Class<?> clazz = object.getClass();

		Field[] fields = null;
		if (isSuperClass) {
			Class<?> superclass = clazz.getSuperclass();
			fields = superclass.getDeclaredFields();
		} else {
			fields = clazz.getDeclaredFields();
		}

		/*Class<?> superclass = clazz.getSuperclass();
		Field[] fieldsParent = superclass.getDeclaredFields();
		Field[] fieldsChild = clazz.getDeclaredFields();
		Field[] fields = new Field[fieldsParent.length + fieldsChild.length];
		System.arraycopy(fieldsParent, 0, fields, 0, fieldsParent.length);
		System.arraycopy(fieldsChild, 0, fields, fieldsParent.length, fieldsChild.length);*/

		if (fields != null && fields.length > 0) {
			for (Field field : fields) {
				// get the annotation for class ViewInject
				if (field.isAnnotationPresent(ViewInject.class)) {
					ViewInject viewInject = field.getAnnotation(ViewInject.class);
					if (viewInject != null) {
						View view = findViewById(object, viewInject.value());
						try {
							if (view != null) {
								field.setAccessible(true);
								field.set(object, view);
							}
						} catch (IllegalAccessException e) {
							e.printStackTrace();
						} catch (IllegalArgumentException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}

	/**
	 * 
	 * @Description: 根据id查找view
	 * @param object
	 *            view or activity
	 * @param id
	 *            the id attribute from the XML
	 * @return
	 */
	private static View findViewById(Object object, int id) {
		View view = null;
		if (object instanceof View) {
			view = ((View) object).findViewById(id);
		} else if (object instanceof Activity) {
			view = ((Activity) object).findViewById(id);
		}
		return view;
	}
}

使用:

   @ViewInject(R.id.title_tv)
    private TextView title_tv;

       // view注解
        InjectUtil.inject(this, false);

2、编译时注解:

https://lizhaoxuan.github.io/2016/07/17/apt-Grammar-explanation/           好!

Android 如何编写基于编译时注解的项目:

http://www.open-open.com/lib/view/open1469021419529.html   最好!

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Android 截图
下一篇: RTP/RTCP/RTSP
当空皓月
粉丝 14
博文 179
码字总数 67070
作品 0
郑州
私信 提问

暂无文章

C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
22分钟前
0
0
JAVA对map进行分组

public static Map<String, List<Map<String, Object>>> transition(List<Map<String, Object>> list){ Map<String, List<Map<String, Object>>> map = new HashMap<>(); //......

火龙战士
29分钟前
0
0
Confluence 6 升级完成后的检查

这个页面中的文章将会为 Confluence 管理员为 Confluence 升级完成后 提供检查列表以确保 Confluence 的升级顺利完成。这个检查列表没有包含所有需要检查的错误,但是将会检查会通常出现错误...

honeymoose
32分钟前
1
0
Vue.js开发环境搭建说明(mac)

vue开发环境搭建(mac) 投影放大:cmd + + 安装Node 下载Node 官网下载 https://nodejs.org/en/download/ 安装Node 双击安装包,选择安装目录,比如: /usr/local/bin 安装成功后最好记录一...

Danni3
48分钟前
2
0
Qt编写自定义控件3-速度仪表盘

前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业...

飞扬青云
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部