学习Butterknife的一点心得(系列)一

我们实现一个完整的一个例子,那么基本了解了其运行机制。

1  创建一个处理注解的项目

    

依次为一个注解,一个注解处理器,一个注解路径配置文件(供编译器识别)。

注解Seriable代码:

@Target({ ElementType.FIELD, ElementType.TYPE })  
@Retention(RetentionPolicy.CLASS) 
public @interface Seriable {

}

@Retention标明生命周期,

RetentionPolicy.CLASS //表示注解是在编译期处理

这个配置文件的内容是BeanProcessor.java的完整路径:com.zhy.annotationprocess.processor.BeanProcessor.

这个BeanProcessor.java的代码为:

@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class BeanProcessor extends AbstractProcessor { // 元素操作的辅助类
	Elements elementUtils;

	ProcessingEnvironment  processingEnv;

	@Override
	public synchronized void init(ProcessingEnvironment processingEnv) {
		super.init(processingEnv);
		// 元素操作的辅助类
		elementUtils = processingEnv.getElementUtils();
		this.processingEnv = processingEnv;

	}

	@Override
	public Set<String> getSupportedAnnotationTypes() {

		Set<String> typeSet = new LinkedHashSet<String>();

		typeSet.add(Seriable.class.getCanonicalName());

		return typeSet;
	}

	@SuppressWarnings("resource")
	@Override
	public boolean process(Set<? extends TypeElement> annotations,
			RoundEnvironment roundEnv) {

		processingEnv.getMessager().printMessage(Kind.ERROR, "12346789");

		// 获得被该注解声明的元素
		Set<? extends Element> elememts = roundEnv
				.getElementsAnnotatedWith(Seriable.class);
		TypeElement classElement = null;// 声明类元素
		List<VariableElement> fields = null;// 声明一个存放成员变量的列表
		// 存放二者
		Map<String, List<VariableElement>> maps = new HashMap<String, List<VariableElement>>();
		try {
			// 遍历
			File file = new File("f:/test.txt");
			FileWriter fWriter = null;
			fWriter = new FileWriter(file,true);

			FileOutputStream outputStream = new FileOutputStream(file,true);
			outputStream.write((" ======elememts size : " +elememts.size()+ "\n").getBytes());
			int i = 1;
			for (Element ele : elememts) {
				//processingEnv.getMessager().printMessage(Kind.ERROR, "12346789",ele);
				outputStream.write((" ======start\n").getBytes());
				outputStream.write((" element name:" + ele.getSimpleName() + " index:" + i + "\n").getBytes());
				outputStream.write((" element enclose_name:"+ele.getEnclosingElement().getSimpleName()+"\n").getBytes());
				outputStream.write(( "element kind:" + ele.getKind().name() + "\n").getBytes());
				outputStream.write(( " element type:" + ele.asType().getKind().name() + "\n").getBytes());
				outputStream.write(("========end\n").getBytes());
				i++;
			}

			outputStream.flush();
			outputStream.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

		return true;
	}

}

然后将其打成一个jar。

2  创建一个测试简单注解框架的项目

  

percent_1.jar就是刚才打的jar包

Article.java和User.java的代码分别为:

@Seriable  
public class Article  
{   
    private String title ;          
    private String content ;        
}   

public class User   
{  
    @Seriable
     int username123;            
    @Seriable  
     String password123;  
  
    private String three;   
    private String four;   
}

对AnntotaionTest1项目配置,使编译器能识别jar中的注解处理器BeanProcessor。

配置完之后回头看BeanProcessor,编译器识别它之后,会调用它的process(...)入口,根据代码会在F盘创建一个test.txt文件,里面打印了被注解的元素的信息。现在我们来看一下这个文件的内容:

======elememts size : 3

======start

element name:username123 index:1

element enclose_name:User

element kind:FIELD

element type:INT

========end

======start

element name:Article index:2

element enclose_name:com

element kind:CLASS

element type:DECLARED

========end

======start

element name:password123 index:3

element enclose_name:User

element kind:FIELD

element type:DECLARED

========end

======elememts size : 0

果然打印出了3条注解元素的信息,这和我们在User和Article注解的元素一一对应。

这里解释一下:element name的值意思为注解元素的名称,element enclose_name:是封装这个元素的实体名称,element kind的值被注解元素的角色,字段或者类等其他,element type:的值表示被注解元素的类型,username123被定义成int,它的type就为INT,password123被定义成String,它的type就为DECLARED。至此简单的编译注解完成测试。在写注解处理器的时候有一点要注意,就是必须实现getSupportedAnnotationTypes()方法

时间: 2024-12-17 07:53:45

学习Butterknife的一点心得(系列)一的相关文章

学习Butterknife的一点心得(系列)三

一 运行期 我们在activity中的onCreate方法中会调用ButterKnife.bind(this);我们进入这个方法: public static void bind(Activity target) { bind(target, target, Finder.ACTIVITY); } target是这个activity,再进入bind方法, static void bind(Object target, Object source, Finder finder) { Class<?

PHP学习路上的一点心得

继学些了java后,接触php的项目后发现 php真的也是很强大的一门语言,这只是一篇回想,想到什么就写什么把,大家随便看看. 1.php其实无需等待,一般的改完代码后直接刷新页面即可,不需要像java 重启服务, 一般我们在调试的时候用的最多的 就是 var_dump(变量名);die;  当然了 die 不 die 取决于你. 看你实际情况. 而在调试SQL问的时候  一般都会用到getLastSql(); 然后跟上面一样 dump出来.初学者在导入php项目的时候可以这样 点击import

学习Git的一点心得以及如何把本地修改、删除的代码上传到github中

一:学习Github的资料如下:https://git.oschina.net/progit/ 这是一个学习Git的中文网站,如果诸位能够静下心来阅读,不要求阅读太多,只需要阅读前三章,就可以掌握Git的常用命令. 二:学习Git中远程仓库的问题: Git的远程仓库:就是管理你代码的地方,这个是Github中提供的有,只要你在Github中注册一下你就可以获得无限个Git的远程仓库. 我的Github中的远程仓库如下图所示: 对远程仓库我首先理解为:在Gitbash中敲一个命令:Git init

关于学习新技术的一点心得

我觉得主要途径有三个. 1.看技术文档. 如果要知其然,那就看文档.特别是对一些库的使用,直接冲过去看官方文档即可.如果是学习一门复杂的语言,那最好看一下入门书籍,有一个整体理解.具体用的时候,在官方文档挑一些章节来看. 2.看技术书籍. 要知其所以然,可以选择看技术书籍,挑好书来看.看技术书籍应该抱着两个心态去看.第一:整体了解这门技术,能做什么?有哪些优势和不足.第二:分析这门技术的核心,模式和框架的实现原理. 3.看源码. 要知其所以然,可以去看源码,多看源码只有好处,没有坏处.看优秀的源

第五次作业-系统实现可能需要用到的技术,及学习相关技术的心得

一.系统实现可能需要用到的技术: 我们团队的项目是学生作业管理系统,为了实现这个系统,我们可能需要用到的技术有面向对象编程.UML建模.ASP.NET.C#.SQL server.JQuery 等. (1)面向对象程序设计(Object-Oriented Programming)是一种起源于六十年代,发展已经将近三十年的程序设计思想.对象是对现实世界实体的模拟,由现实实体的过程或信息来定义.一个对象可被认为是一个把数据(属性)和程序(方法)封装在一起的实体,这个程序产生该对象的动作或对它接受到的

学习软件工程课的心得上

一开始看到软件工程的课本的时候,我看了一下,书名为<软件工程--理论.方法与实践>,我本来以为这将会是大三这一学期相对轻松的课程. 没有想到,第一节课,老师的PPT上对软件工程课的吐槽让我惊呆了,我想,到底该怎么办啊?是不是这一学期会被这门课给烦死给累死啊.然后不出所料的,不久之后老师就布置了第一个编程的作业,其实我的编程特别的差劲,但是既然布置了作业,没有办法,只能硬着头皮做下去,其实不得不承认,当时心里其实是有一些怨念的,但是没有别的法子,只能上网搜,然后一点点的看,查,最后终于弄懂了算法

学习软件工程课的心得

一开始看到软件工程的课本的时候,我看了一下,书名为<软件工程--理论.方法与实践>,我本来以为这将会是大三这一学期相对轻松的课程. 没有想到,第一节课,老师的PPT上对软件工程课的吐槽让我惊呆了,我想,到底该怎么办啊?是不是这一学期会被这门课给烦死给累死啊.然后不出所料的,不久之后老师就布置了第一个编程的作业,其实我的编程特别的差劲,但是既然布置了作业,没有办法,只能硬着头皮做下去,其实不得不承认,当时心里其实是有一些怨念的,但是没有别的法子,只能上网搜,然后一点点的看,查,最后终于弄懂了算法

关于数据库学习进阶的一点体悟

收到李华荣邀请,写一篇关于数据库方面的学习经验和感悟心得的文章,最初有点诚惶诚恐,因为自己技术上也只能算个半吊子,无奈他不嫌弃,那就硬着头皮分享一下自己数据库方面的一些学习经验以及心得体会吧,希望对刚入门的同行有所帮助. 关于学习方法,个人感觉因人而异,有些方法不见得适合所有人.个体不同,学习方式与学习效率也各有不同.找到适合自己的学习方法才是最重要的.所以关于这方面,大家秉承取其精华.去其糟粕的原则来看待吧! 有句话说得很好,"以大多数人的努力程度之低,根本轮不到拼天赋",一直以来,

移动web动画设计的一点心得——css3实现跑步

[原]移动web动画设计的一点心得——css3实现跑步 今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作).加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多.最近比较忙,给自己敲个响钟:注意身体. 说完题外话,开始近期的主