一、实现需求
利用反射和注解方式,模拟ButterKnif实现View注入。
二、实现步骤
** 1、创建注解InjectView **
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectView {
@IdRes int value();
}
** 2、反射工具类 **
public class InjdectUtils {
public static void injectView(Activity activity) {
Class<? extends Activity> cls = activity.getClass();
Field[] declaredFields = cls.getDeclaredFields();
for (Field field : declaredFields) {
//判断属性是否被有InjectView注解
if (field.isAnnotationPresent(InjectView.class)) {
InjectView in = field.getAnnotation(InjectView.class);
// 获取注解中设置的id
int id = in.value();
View viewById = activity.findViewById(id);
//设置能够操作private属性的权限
field.setAccessible(true);
try {
//把获取的view实例设置到属性上
field.set(activity, viewById);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
** 3、MainActivity **
public class MainActivity extends AppCompatActivity {
//加入自定义注解
@InjectView(R.id.tv)
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用反射赋值
InjdectUtils.injectView(this);
tv.setText("annotation injectView");
}
}