1.反射:
获取实例:
<1>Class clazz=类名.Class
<2>实例.getClass()
<3>Class.forName(“类的全路径”)
//这是获取任意权限修饰的变量(private public protected...)
获取类中的变量:Filed filed=clazz.getDeclaredField("类中的属性名");
获取类中的所有变量:Field[] fields = clazz.getDeclaredFields();
获取类中的方法:clazz.getDeclaredMethod("该方法需要传入的值", "传入值的引用类型的实例");
clazz.getDeclaredMethod("kkk", String.class);
获取类中的所有方法:
Method[] declaredMethods = clazz.getDeclaredMethods();
获取注解:field.getAnnotation(ViewInject.class);//(变量名上边有注解的变量)
field.setAccessible(true);//暴力访问
☆☆重点☆☆
<1>给变量赋值
//给 "实例" 的 "field" 字段的值设置为 "具体值""
field.set(实例, 具体值);
<2>调用实例中的方法
//调用 "实例" 的 "method" 方法,并根据 method方法的需要传入相应值,也可以接收method方法的返回值
method.invoke(activity, view);
注解:百度释义
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)
自定义注解:
@Target(ElementType.METHOD) // 设置适用范围为方法
@Retention(RetentionPolicy.RUNTIME) // 设置生命周期
public @interface OnClick {
int value();//用value,在使用注解的时候只需要指明具体值就行
}
下面是我仿ViewInject的依赖注入功能,在activity中省去了findViewByid的繁琐功能
自定义注解
<1>实现点击按钮的监听事件
@Target(ElementType.METHOD) // 设置适用范围为方法
@Retention(RetentionPolicy.RUNTIME) // 设置生命周期
public @interface OnClick {
int value();
}
<2>实现findViewByid
@Target(ElementType.FIELD) // 适用于成员变量
@Retention(RetentionPolicy.RUNTIME) // 他的生命周期
public @interface ViewInject {
int value();
}
通过反射拿到相应的值
package com.lligang.viewinject_test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
public class ViewUtils {
public static void inject(Activity activity) {
// 实现findViewByid的功能
bindView(activity);
// 实现点击按钮的功能
bindOnclik(activity);
}
private static void bindView(Activity activity) {
// 通过反射获取实例
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 获取我所需要的注解
ViewInject viewInject = field.getAnnotation(ViewInject.class);
if (viewInject != null) {
int resId = viewInject.value();
View view = activity.findViewById(resId);
field.setAccessible(true);
try {
// 给activity的field字段的值设置为view对象
field.set(clazz, view);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private static void bindOnclik(final Activity activity) {
final Class clazz = activity.getClass();
Method[] declaredMethods = clazz.getDeclaredMethods();
for (final Method method : declaredMethods) {
OnClick onClick = method.getAnnotation(OnClick.class);
if (onClick != null) {
int resId = onClick.value();
final View view = activity.findViewById(resId);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 通过反射调用当前用户的方法
method.setAccessible(true);
try {
method.invoke(activity, view);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
}