1. 常见元注解
定义:元注解是由Java提供的一套用来注解其他注解的基础注解。
@Target:指定注解的作用范围
@Retention:指定注解的作用策略
@Inherited:被该注解修饰的注解,作用在某个类上可以被子类继承
@Documented:给Javadoc配置的
Android常见的元注解
@IntDef
@StringDef
1.1 @Target
ElementType.TYPE:类、接口或枚举声明
ElementType.FIELD:字段声明
ElementType.METHOD:方法声明
ElementType.PARAMETER:形参声明
ElementType.CONSTRUCTOR:构造函数声明
ElementType.LOCAL_VARIABLE:局部变量声明
ElementType.ANNOTATION_TYPE:注解类型声明
ElementType.PACKAGE:包声明
ElementType.TYPE_PARAMETER:类型参数声明
ElementType.TYPE_USE:类型的使用
ElementType.MODULE:模块声明
1.2 @Retention
RetentionPolicy.SOURCE
指定注解只在源码阶段有用,编译器编译之后将会丢弃,
用来做代码限制或者提示。如Override用来提示方法重写了父类的方法。
RetentionPolicy.CLASS
指定注解将由编译器记录在类文件中,但在运行时虚拟机不会保留,
如果不指定@Retention。Android中经常用到一些方法参数的限制中,
如LayoutRes、NonNull、IntRange等。
RetentionPolicy.RUNTIME
指定注解会被编译器记录在类文件中,并在运行时虚拟机会保留,
因此它们可以在程序运行时读取。
1.3 @Inherited
// 被@Inherited注解了的注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ParentAnn{
}
// 没有@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ChildAnn {
}
使用
// 父类使用了上面两个注解
@ParentAnn
@ChildAnn
public class Parent {
}
// 子类继承了父类,但是没有任何实现
public class Child extends Parent {
}
1.4 @IntDef
@Retention(SOURCE)
@Target({ANNOTATION_TYPE})
public @interface IntDef {
/** Defines the constant prefix for this element */
String[] prefix() default {};
/** Defines the constant suffix for this element */
String[] suffix() default {};
int[] value() default {};
boolean flag() default false;
}
主要作用就是替代枚举显示参数范围,减少内存使用。
2 .自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjecLayout {
int value();
}
然后写工具类,在MainActivity中的onCreate中super.onCreate(savedInstanceState)之前初始化。InjectUtils .inject(this);
public class InjectUtils {
private static final String TAG = "InjectUtils ";
public static void inject(Object context){
injectLayout (context);
}
}
private static void injectLayout (Object context) {
Class<?> aClass = context.getClass();
InjecLayout annotation = aClass.getAnnotation(InjecLayout .class);
Log.e(TAG, "injectLayout: annotation.value()="+annotation.value());
try {
Method contentView = aClass.getMethod("setContentView", int.class);
try {
Object invoke = contentView.invoke(context, annotation.value());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
使用注解
@InjecLayout (R.layout.activity_main)
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView();
3 .常见注解框架
JUnit Java语言的单元测试框架
常见方法
@Test
@BeforeClass
@AfterClass
@Before
@After
@Ignore
ButterKnife Android 开发中 IOC 框架
@BindView
@OnClick
@BindString
Dagger2著名的依赖注入框架
@Inject
@Moudle
@Provider
@Component
@Singleton
@Scope
@Qualifier
@Named
Retrofit是一个 RESTful 的 HTTP 网络请求框架的封装
@GET
@POST
@PUT
@DELETE
@PATCH
@HEAD
@OPTIONS
@HTTP
EventBus是一种用于Android的事件发布-订阅总线
@Subscribe
ARouter 是阿里开源的组件化框架
@Route
@Interceptor
@Autowired
总结,使用注解极大的提高了开发效率,有利有弊,使用时大家自行选择。