上一章节,讲述了ARouter的使用。详情
Android 组件化 路由跳转(上)
https://blog.youkuaiyun.com/weixin_37730482/article/details/70677352
因为ARouter的依赖比较多,功能比较多。如果我们的项目仅仅需要完成组件的跳转和传值,我们完全可以自己写一个路由组件。
一.注解
1.前言
我们注意到,我们使用ARouter时,源码中有如下内容
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Route {
String path();
String group() default "";
String name() default "";
int extras() default -2147483648;
int priority() default -1;
}
那么@interface是什么意思呢?我们知道interface是接口,那么带有@符号是什么意思呢?是注解的意思。
2.Demo实现
注解类
package com.wjn.componentdemo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PeopleInfo {
/**
* 姓名 默认“ ”
*/
String name() default "";
/**
* 性别 默认“ ”
*/
String sex() default "";
/**
* 年龄 默认0
*/
int age() default 0;
/**
* 身高 默认0
*/
long height() default 0;
}
使用类
public class MainActivity extends AppCompatActivity {
@PeopleInfo(name = "张三")
private String name;//姓名
@PeopleInfo(sex = "男")
private String sex;//性别
@PeopleInfo(age = 32)
private int age;//年龄
@PeopleInfo(height = 113)
private int height;//体重
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFieldName();
}
/**
* 解析PeopleInfo类属性的注解
*/
private void getFieldName() {
//1.getDeclaredFields方法会返回ProductReflectAnnotation类所有的属性
Field[] fields = MainActivity.class.getDeclaredFields();
for (Field field : fields) {
//2.判断属性是否标注了@PeopleInfo注解
boolean hasField = field.isAnnotationPresent(PeopleInfo.class);
if (hasField) {
//3.获取@PeopleInfo注解
PeopleInfo peopleInfo = field.getAnnotation(PeopleInfo.class);
if (null == peopleInfo) return;
//获取@PeopleInfo注解 参数值
String name = peopleInfo.name();
String sex = peopleInfo.sex();
int age = peopleInfo.age();
long height = peopleInfo.height();
Log.d("MainActivity", "name----:" + name);
Log.d("MainActivity", "sex----:" + sex);
Log.d("MainActivity", "age----:" + age);
Log.d("MainActivity", "height----:" + height);
}
}
}
}
注意
isAnnotationPresent:判断是否标注了指定注解
getAnnotation:获取指定注解,没有则返回null
getAnnotations:获取所有注解,包括继承自基类的,没有则返回长度为0的数组
getDeclaredAnnotations:获取自身显式标明的所有注解,没有则返回长度为0的数组
结果
D/MainActivity: name----:
D/MainActivity: sex----:
D/MainActivity: age----:32
D/MainActivity: height----:0
D/MainActivity: name----:
D/MainActivity: sex----:
D/MainActivity: age----:0
D/MainActivity: height----:113
D/MainActivity: name----:张三
D/MainActivity: sex----:
D/MainActivity: age----:0
D/MainActivity: height----:0
D/MainActivity: name----:
D/MainActivity: sex----:男
D/MainActivity: age----:0
D/MainActivity: height----:0
说明
<1> Target:指明该类型的注解可以注解的元素范围。有如下取值
ElementType.TYPE 用于类,接口,枚举,但不能是注解
ElementType.FIELD 作用于字段,包含枚举值
ElementType.METHOD 作用于方法,不包含构造方法
ElementType.PARAMETER 作用于方法的参数
ElementType.CONSTRUCTOR 作用于构造方法
ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
ElementType.ANNOTATION_TYPE 作用于注解
ElementType.PACKAGE 作用于包
<2> Retention:指明在什么级别显示此注解。有如下取值
RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中