IoC的概念介绍

控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转。在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,做到控制反转需要一个容器来实现,就是我们所说的IoC容器,最常见的IoC容器是Spring。

控制反转从字面意思看来不是很好理解,其实就是将创建管理对象的工作交给容器来做。在以前的编程中,创建一个对象需要显式的new出来,但是控制反转是在容器初始化(或者某个指定时间节点)时通过反射机制(上一篇文章有介绍)创建好对象,在使用时去容器中获取。将对象的控制权反过来交给容器管理,所以称之为“控制反转”。

ViewUtils视图相关工具类

功能:

  • android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
  • 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
  • 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event

我们使用ViewUtils框架来实现android中的findViewbyId和setOnClickListener的点击事件

首先下载viewUtils的jar包

添加到项目中

我们来看看utils的一个简单的使用

package im.weiyuan.com.viewutils;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;public class MainActivity extends AppCompatActivity {@ViewInject(R.id.tv_main_title)private TextView tv_main_title;@ViewInject(R.id.btn_main)private Button btn_main;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这里一定要初始化注解ViewUtils.inject(this);}@OnClick(R.id.btn_main)//login的参数必须是 View viewpublic  void login(View view ){Toast.makeText(MainActivity.this,"事件被点击了",Toast.LENGTH_LONG).show();}
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="im.weiyuan.com.viewutils.MainActivity"><TextViewandroid:id="@+id/tv_main_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:text="点击"android:id="@+id/btn_main"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>

接下来我们我们编译一个自定义的注解类

在eliclipse中新建一个注解类:

public @interface ViewInject {}

注解类是以

 @interface开头的@Target 是Java的元注解(指修饰注解的注解)之一。用来指定注解修饰类的哪个成员。加大括号表示一个数组,指被修饰的注解能用于多个不同的类成员。举个栗子:
@Target(ElementType.FIELD)
public @interface A{}

表示注解A只能用来修饰类中的Field
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface A{}

表示注解A能用来修饰类中的Field和Method用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,在运行的时候不被虚拟机保留;用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息不会留在class文件中,注解的信息只会留在源文件中;用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,

5  为注解增加各种属性

什么是注解的属性?
      一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是黑马的学生,否则,就不是。

如果还想区分出是黑马哪个班的学生,这时候可以为胸牌再增加一个属性来进行区分。

加了属性的注解效果为:@MyAnnotation(color="red")。

定义基本类型的属性和应用属性:
      在注解类中增加String color(); 被添加的注解设置属性值:@MyAnnotation(color="red")。

我们来看下程序的代码:

package www.weiyuan.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import javax.lang.model.element.Element;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {int age();String name();
}

我们定义了一个注解类ViewInject ,该类运行的声明周期是真个程序运行的声明周期

对普通成员类的字段进行注解

现在我们定义了一个普通的user类

package www.weiyuan.test;public class User {@ViewInject(age =10, name = "45554")private String name;private int age;private void  eat(String eat){}
}

上面就是一个简单的用法

如果注解类中不指明是对成员变量进行注解,写成下面的形式

package www.weiyuan.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import javax.lang.model.element.Element;@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {int age();String name();
}

默认表示可以对普通类的整个类进行注解,可以是类的成员变量,也可以注解类的函数方法

本质上注解就是标签:上面就是对user类贴上了一个标签

在详细介绍注解之前先分析下反射的原理

我们来详细的看下面的一个列子相当的经典:

package www.weiyuan.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import javax.lang.model.element.Element;@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {int age();String name();
}

package www.weiyuan.test;public class User {//添加在属性name上面的注解@ViewInject(age =10, name = "45554")private String name;private int age;private void  eat(String eat){System.out.println(eat);}
@Override
public String toString() {return "User [name=" + name + ", age=" + age + "]";
}
}

主程序:

package www.weiyuan.test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class Test {public static void main(String[] args) {User user = new User();//首先获得对象的字节码文件Class classz = User.class;//对该文件进行破解 getDeclaredField不管是私有变量还是公开变量都能够获得try {Field field = classz.getDeclaredField("name");Field field2 = classz.getDeclaredField("age");//获得该字段上面的注解类ViewInject annotation = field.getAnnotation(ViewInject.class);if(annotation != null){//获得自定义注解类中的参数int age = annotation.age();String name = annotation.name();//通过暴力反射,将获得的值赋值给user对象//设置字段的可以暴力反射field.setAccessible(true);field2.setAccessible(true);//给上面创建的值设置name属性的值
                field.set(user, name);field2.set(user, age);System.out.println(user.toString());//打印输出是:User [name=45554, age=10]
            }//调用User类的eat方法Method declaredMethod = classz.getDeclaredMethod("eat",String.class);//让该方法可以执行declaredMethod.setAccessible(true);declaredMethod.invoke(user, "吃饭了");} catch (Exception e) {// TODO Auto-generated catch block
            e.printStackTrace();} }}

程序的运行结果是:

转载于:https://www.cnblogs.com/kebibuluan/p/7213979.html

java 中的 viewUtils框架相关推荐

  1. java中的集合框架_JAVA中的集合框架(上)List

    第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...

  2. Java 中的 Swing 框架现在是不是被淘汰了?

    关于java中的Swing框架,我先说下如下的观点. 1 只要是用java开发的商业项目,就指着来挣钱的项目,都不会用Swing框架. 2 所以对java初学者来说,根本没必要学swing,甚至连类似 ...

  3. 【Log】(二)Java 中的日志框架 JCL、SLF

    [Log](一)Java 中的日志框架 JUL.Log4j [Log](二)Java 中的日志框架 JCL.SLF [Log](三)Java 中的日志框架 logback.log4j2 前言 JUL ...

  4. Java中人工智能的框架

    在 Java 中, 常用的人工智能框架有: Deeplearning4j: 一个用于深度学习的开源 Java 框架, 可以在多种平台上运行, 包括 CPU, GPU 和 Apache Hadoop. ...

  5. Java中的SSM框架指的什么?有哪些优点?

    Java SSM框架即指Spring+SpringMVC+MyBatis的简称,框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较 ...

  6. Java中的tiles_tiles框架简单教程

    大家好,我是IT修真院深圳分院第18期学员,一枚正直善良的JAVA程序员. 今天给大家分享一下,修真院官网JAVA任务4中,tiles框架. 一.背景介绍 如果我们所有的页面都是靠对应的一个 jsp ...

  7. java中的ssm框架是什么_什么是SSM框架,它的组成和作用是什么?

    SSM框架即指Spring+SpringMVC+MyBatis的简称,相比于之前的SSH(Struts+Spring+Hibernate),SSM更加轻量化和灵活,是目前比较主流的java web开发 ...

  8. java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!

    三大框架:Struts+Hibernate+Spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...

  9. java中的集合框架

    集合,也就是容器,用于存储数据,也就是装东西的. 面向对象里包含很多容器,变量多了,用数组存起来.数组多了,用二维数组存起来.数据多了,用对象存起来.对象多了,用集合存起来. 但数组也能存对象,为什么 ...

最新文章

  1. CVPR2019 | 斯坦福学者提出GIoU,目标检测任务的新Loss
  2. 一份很不错的敏捷产品接口文档模板
  3. 我的世界java下载1.13_Minecraft Java版 1.13.1-pre2 发布
  4. .net core 文件流保存图片_使用JSDelivr加速Github、博客文件
  5. windows10访客_如何在Windows 10中创建访客帐户
  6. 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录
  7. 全球地区资料json 含中英文 经纬度_2020年Brain Bee北京、天津、河北赛区地区赛参赛说明...
  8. 你见过最奇葩的人和事是什么?
  9. 计算机专业英语第五章ppt,计算机专业英语课件5.ppt
  10. 【ML小结11】高斯混合模型GMM
  11. php多进程结合Linux利器split命令实现把大文件分批高效处理
  12. 微分几何、黎曼几何思想
  13. Java程序员,面试必读
  14. 3D打印成型技术:看得见摸得着的真实
  15. 技能设计漫谈 ——从游戏性和流畅角度来看技能的设计要点。
  16. 迈特二十能升到鸿蒙系统吗,华为鸿蒙OS 2.0系列Beta 2发布
  17. 轻巧入耳,畅享高音质,雷柏VM700S蓝牙TWS背光游戏耳机开箱实测
  18. 有关计算机时代的英语阅读理解题,2020-2021高考英语阅读理解综合经典题附详细答案...
  19. 太赫兹技术检验滚塑制品壁内气泡缺陷的可行性
  20. prometheus数据结构和压缩原理讲解

热门文章

  1. LLYFSpy W.I.P
  2. 毕业设计:基于Springboot实现物流统计分析系统
  3. KS003基于JSP和Servlet实现的商城系统
  4. 如果对象为空,java函数String.valueOf(Object obj)返回null字符串
  5. 当Elasticsearch遇见Kafka
  6. 信息化及信息化的五个层次
  7. 团队作业8----第二次项目冲刺(Beta阶段) 第六天
  8. ios手势识别-单击
  9. plsql 参数中in out in的区别讲解
  10. OpenCvSharp中CV_8UC1,CV_8UC2等参数的解释