实现基于注解(Annotation)的数据库框架(四)注解(Annotation)和反射的结合使用
来源:互联网 发布:知乎阿里dva框架react 编辑:程序博客网 时间:2024/06/04 23:31
前言
反射和注解的基本知识我们都已经了解了,这一篇来具体看看他俩如何结合使用,离我们的最终目标越来越近了。
正文
现在来写一个通过注解来实现setContentView()的功能的Demo。
首先我们需要自定义一个注解,我们命名为ContentView:
package com.lzp.annotationstudy;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by li.zhipeng on 2017/3/9. * * 注解测试类 */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ContentView { int value();}
ContentView注解用来注解某一个类(TYPE),在运行时可以通过反射获取到具体的信息。value()之前介绍过,如果注解只有一个属性,系统推荐用value,注解中的值会以键值对的形式保存,就是属性的名称对应自身的值,而系统默认是value就是其中的一个键,这样的好处之后会看到。
定义好注解,现在就要通过反射来实现具体的功能了:
package com.lzp.annotationstudy;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * Created by li.zhipeng on 2017/3/9. * * 注解工具类 */public class AnnotationUtils { public static void injectObject(Object handler){ // 拿到参数的Class类型 Class<?> handleType = handler.getClass(); // 获取Class类型上的ContentView注解 ContentView contentView = handleType.getAnnotation(ContentView.class); if (contentView != null){ try { // 通过反射找到Class类型中的setContentView(int param)方法 Method setContentViewMethod = handleType.getMethod("setContentView", int.class); // 调用setContentView(int param),第一个是操作的对象,第二个是方法的参数 setContentViewMethod.invoke(handler, contentView.value()); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }}
代码中已经有很详细的注释了,接下来看看MainActivity中的代码:
package com.lzp.annotationstudy;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;//@ContentView(value = R.layout.activity_main)@ContentView(R.layout.activity_main)public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AnnotationUtils.injectObject(this); }}
这里看到了推荐使用value的好处,因为名称默认是value,所以我们就不需要写“value = ”了,如果是其他的名称,例如name之类的,就必须要写了。
看一下运行效果:
ok!!!
总结
到这里所有的基础部分就都已经结束了,demo中反射了类的方法, 反射属性也大同小异,没什么太大的差别,下一篇直奔主题:自定义屌爆了的数据库框架。
0 0
- 实现基于注解(Annotation)的数据库框架(四)注解(Annotation)和反射的结合使用
- 实现基于注解(Annotation)的数据库框架(二)注解(Annotation)的基本了解
- 实现基于注解(Annotation)的数据库框架(三)自定义注解(Annotation)
- 实现基于注解(Annotation)的数据库框架(一)反射的基本了解
- 实现基于注解(Annotation)的数据库框架(六)亲自验证反射的效率及解决办法
- 实现基于注解(Annotation)的数据库框架(五)最终的实战
- Hibernate(四)基于注解annotation的配置
- 基于注解(Annotation-based)的配置
- 通俗讲解Annotation注解(反射注解)
- Annotation(自定义注解)反射获取注解
- Java的Annotation(注解)
- Annotation(注解)_注解的自定义
- Annotation 注解的实现
- annotation注解的使用
- Annotation注解的使用
- springMVC基于注解(annotation)的Hello world
- Struts2基于注解Annotation的零配置开发(一)
- Struts2基于注解Annotation的零配置开发(二)
- span设置值、获取span 的值
- VS2015密钥
- 查询A表B表同时存在记录, A表存在而B表不存在记录, B表存在而A表不存在记录
- 我的单词本
- Linux内核的Kconfig Makefile .config
- 实现基于注解(Annotation)的数据库框架(四)注解(Annotation)和反射的结合使用
- static
- android.content.res.Resources$NotFoundException解决办法
- Android|图形图像之Paint
- Ubuntu安装到指定盘
- mac系统下配置Appium
- RDD,DataFrame,DataSet区别
- shell 下执行mysql 命令
- llvm学习笔记(2)