1.setContentView绑定
//注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface ContentView {
int value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
2.实现控件绑定
public @interface BindView {
int value();
}
/**
* Created by lenovo on 2018/1/24.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Inherited
3.实现控件的点击事件绑定
public @interface MyAnnotation {
int value();//一个方法的时候,用value();
}
//注解的工具类
package com.bawei.com.reflection.zhujie;
import android.app.Activity;
import android.view.View;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by lenovo on 2018/1/24.
*/
//注解的工具类
public class InjectUtils {
public static void inject(Activity activity) {
injectContenView(activity);
injectBindView(activity);
injectMyonclickView(activity);
}
//注解点击事件
private static void injectMyonclickView(final Activity activity) {
//得到Activity字节码
Class clazz = activity.getClass();
try {
final Method obcilck = clazz.getMethod("Obcilck", null);
MyAnnotation annotation = obcilck.getAnnotation(MyAnnotation.class);
if (annotation != null) {
int value = annotation.value();
final View view = activity.findViewById(value);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
obcilck.invoke(activity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
//Textview的赋值
private static void injectBindView(Activity activity) {
//得到Activity字节码
Class clazz = activity.getClass();
//得到Activity的所有成员变量
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
//设置权限
field.setAccessible(true);
//得到成员变量上面的注解
BindView bindView = field.getAnnotation(BindView.class);
if (bindView != null) {
//得到注解的值
int id = bindView.value();
//得到每个id的view
View view = activity.findViewById(id);
try {
//通过反射方法,初始化成员变量
field.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
//Activity的布局
private static void injectContenView(Activity activity) {
//得到Activity字节码
Class clazz = activity.getClass();
//得到类上面的注解
ContentView contentView = (ContentView) clazz.getAnnotation(ContentView.class);
if (contentView != null) {
int layoutId = contentView.value();
try {
Method method = clazz.getMethod("setContentView", int.class);
method.invoke(activity, layoutId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//MainActiviy
package com.bawei.com.reflection.zhujie;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.bawei.com.reflection.R;
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@BindView(R.id.tv1)
TextView tv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
InjectUtils.inject(this);
indate();
}
private void indate() {
tv.setText("dsadsadsadsad");
}
@MyAnnotation(R.id.btu)
public void Obcilck(){
Toast.makeText(this, "大萨达所", Toast.LENGTH_SHORT).show();
}
}