Android元注解和自定义注解分析

本文介绍了Android中常见的元注解,如@Target、@Retention、@Inherited,以及@IntDef在限制参数范围上的应用。接着讲解了自定义注解的创建与使用,结合InjectUtils工具类实现注解注入。还提到了一些知名的注解框架,如JUnit、ButterKnife、Dagger2、Retrofit和EventBus,以及它们的关键注解用法。最后,文章探讨了注解带来的开发效率提升及其潜在影响。
摘要由CSDN通过智能技术生成

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
总结,使用注解极大的提高了开发效率,有利有弊,使用时大家自行选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BFP_BSP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值