框架基础(注解+反射)

创建布局注解类MyContentView.java,代码如下:

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE})

public @interface MyContentView {

int value();

}

创建控件注解类MyViewInject.java,代码如下:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface MyViewInject {

int value();

}

创建处理注解的反射类MyViewUtils.java,代码如下:

public class MyViewUtils {

// 构造方法注入事件

public static void inject(Activity activity) {

injectObject(activity, new ViewFinder(activity));// 实际注入对象的方法

}

//事件注入对象的方法

private static void injectObject(Object obj, ViewFinder viewFinder) {

// 将注解的信息注入到实际方法中,实现布局的初始化,获得实体类

Class clz = obj.getClass();

// 获得clz的注解信息(自定义的注解信息)

MyContentView myContentView = (MyContentView) clz.getAnnotation(MyContentView.class);

// 获取实际的注解是存在的

if (myContentView != null) {

/**布局的注解获取XML布局**/

// 获取注解的值

int value = myContentView.value();

// 获取的内容注入到制定的方法中

try {

// 设置了setContentView的参数(getDeclareMethod不能获取public方法?)

// setContentView方法就是获取XML布局的方法

Method method = clz.getMethod("setContentView",new Class[] { Integer.TYPE });

method.setAccessible(true);//该设置表示无视权限,直接获取

method.invoke(obj, value);//将获取了参数的setContentView方法添加到指定类中

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

/**控件的注解获取XML布局控件**/

// 获取控件的信息,并注入内容,获取所有的的成员Field[]上的MyViewInject,

//要有Declared,可以访问私有的属性

// 可见,控件的创建必须定义成成员变量才可以使用注解方式

Field[] fields = clz.getDeclaredFields();

// 有成员变量,并且数量不是0

if (fields != null && fields.length != 0) {

for (int i = 0; i < fields.length; i++) {

Field field = fields[i];

// 获取注解的信息(成员变量上的)

MyViewInject inject = field.getAnnotation(MyViewInject.class);

if (inject != null) {

// 获取实际的内容

int fieldValue = inject.value();

// 自定义方法获取viewFinder,调用findViewById的方法,帮助当前的obj找到控件

View view = viewFinder.findViewById(fieldValue);

if (view != null) {

try {

field.setAccessible(true);// 无视访问权限

field.set(obj, view);// 把他赋值给Field成员变量

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

}

}

}

}

// 自定义了,进行找控件

public static class ViewFinder {

private Activity activity;

private View view;

public ViewFinder(Activity activity) {

this.activity = activity;

}

public ViewFinder(View view) {

this.view = view;

}

// id填写进来,把实际的View给返回出去

public View findViewById(int id) {

View view = activity.findViewById(id);

return view;

}

}

}

最后,进行测试,测试类TestViewUtilsActivity.java,代码如下:

@MyContentView(R.layout.activity_test_view_utils)

public class TestViewUtilsActivity extends Activity {

@MyViewInject(R.id.textview_text)

private TextView textView;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyViewUtils.inject(this);

textView.setText("测试的数据,注解+反射的方式");

}

}

布局文件中只含有一个文本框,这里不再上代码。

时间: 2024-10-09 08:27:24

框架基础(注解+反射)的相关文章

JAVA 三大框架基础面试题

一.Spring面试题1.Spring 在ssm中起什么作用? Spring:轻量级框架作用:Bean工厂,用来管理Bean的生命周期和框架集成.两大核心: 1.IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory. 2.AOP:面向切面编程2.Spring的事务? 编程式事务管理:编程方式管理事务,极大灵活性,难维护.声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务

框架基础:关于ajax设计方案(三)---集成ajax上传技术

之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的level2的改进就不介绍了,不清楚的可到前几篇博客去看看.我们直接切入主题. 概念介绍: 1. js的FormData:js中在新的版本中已经支持了FormData对象,可以初始化一个空的form,或者初始化已经存在的form,浏览器测试代码. 2. 浏览器的支持:浏览器已支持input=file的

框架基础:ajax设计方案(三)---集成ajax上传技术

之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的level2的改进就不介绍了,不清楚的可到前几篇博客去看看.我们直接切入主题. 概念介绍: 1. js的FormData:js中在新的版本中已经支持了FormData对象,可以初始化一个空的form,或者初始化已经存在的form,浏览器测试代码. 2. 浏览器的支持:浏览器已支持input=file的

框架基础:ajax设计方案(一)---集成核心请求

框架基础:ajax设计方案(一)---集成核心请求 框架基础:ajax设计方案(一)---集成核心请求 报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉唉唉唉唉 报告,我要说话!Jquery太丰富了,老子只用了几个功能,妈的,太不划算了,啊啊啊啊啊啊 ...... 好了,言归正传.对于想到整理ajax设计方案,原因如下: 从资源合理利用的角度以及

(C/C++)基于SharpUI控件库的插件式框架开发--第三篇框架基础服务库

一个框架基础的东西,一般也是操作的最基础的类,比如char.int.bool等,有时出现内存泄露的问题导致错误的抛出,但是C++开发有的时候就算是抛出异常,那也是靠经验来积累才能非常快速准确的找出错误所在,这就需要在框架中需要添加日志管理的接口,日志管理的好处就是开发者自身在找异常时提供参考,另一个就是如果用户操作时出现问题,也可将日志反馈,帮助快速解决问题:总之了为了更好的扩展完善我的框架,我详细列一下这个基础服务库(XPCore)包含内容: 虽说sharpui控件库内封闭好string类,但

java 基础之 反射技术

1. java代码 在 java 语言中最核心的就是代码的运行, 按照面向对象的思想,在调用java代码时往往需要先创建对象,再调用方法, 而写在方法中的即所谓的java 代码 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime 2. Class 对象 在java中用一个Class对象来表示一个java类的class阶段 Class对象封装了一个java类中定义的成员变量.成员方法.构造方法.类名.包名等 获得class对象的三种方式和区别 //

Struts2框架之-注解开发

Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style="font-size:18px;">  <!-- 这是包名和命名空间的声明 --> <package name="orgPackage" namespace="/org" extends="struts-default"

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Respository:标识持久层组件 3.@Service:标识业务层组件 4.@Controller:标识表现层组件 Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件