一,什么是反射??
反射机制是在运行状态中,对于任意一个类(Class),都能够知道这个类的所有属性和方法(Method);对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二,什么是注解??
Annotation(注解)就是Java提供了一种源程序中的元素关联任何信息或者任何元数据(metadata)的途径和方法。
Annotation是被动的元数据,永远不会有主动行为
一,元注解
元注解有:
@Retention:注解保留的生命周期
@Target:注解对象的作用范围。
@Inherited:@Inherited标明所修饰的注解,在所作用的类上,是否可以被继承。
@Documented:如其名,javadoc的工具文档化,一般不关心。
@Target: Target标明了注解的适用范围,对应ElementType枚举,明确了注解的有效范围。
TYPE:类、接口、枚举、注解类型。
FIELD:类成员(构造方法、方法、成员变量)。
METHOD:方法。
PARAMETER:参数。
CONSTRUCTOR:构造器。
LOCAL_VARIABLE:局部变量。
ANNOTATION_TYPE:注解。
PACKAGE:包声明。
TYPE_PARAMETER:类型参数。
TYPE_USE:类型使用声明。
@Inherited: 注解所作用的类,在继承时默认无法继承父类的注解。除非注解声明了@Inherited。同时Inherited声明出来的注,只对类有效,对方法/属性无效。
二,自定义注解
1 ,运行时注解
了解了元注解后,看看如何实现和使用自定义注解。这里我们简单介绍下运行时注解RUNTIME,编译时注解CLASS留着后面分析。
首先,创建一个注解遵循: public @interface 注解名 {方法参数}
2,编译时注解
运行时注解RUNTIME如上2.1所示,大多数时候实在运行时使用反射来实现所需效 果,这很大程度上影响效率,如果BufferKnife的每个View注入不可能如何实现。实 际上,ButterKnife使用的是编译时注解CLASS,如下图X2.2,是ButterKnife的 @BindView注解,它是一个编译时注解,在编译时生成对应java代码,实现注入。
下面开始通过反射获取注解的内容
1,
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"/>
2,自定义注解类DraweeViewAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DraweeViewAnnotation {
String name();
}
3,MainActivity
public class MainActivity extends AppCompatActivity {
@DraweeViewAnnotation(name = "哈哈哈你怕是个傻子吧")
String str;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getwocontent();
}
});
}
private void getwocontent() {
MainActivity activity = new MainActivity();
Class aClass = activity.getClass();
Field[] fields = aClass.getDeclaredFields();
for(Field f:fields)
{
DraweeViewAnnotation annotation = f.getAnnotation(DraweeViewAnnotation.class);
if(annotation!=null)
{
String name = annotation.name();
Log.d("name",name);
Toast.makeText(MainActivity.this,name,Toast.LENGTH_LONG).show();
}
}
}
}