定义注解:
package com.fyfeng.android.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD })
public @interface ClickMethod {
int id();
}
注解处理:
package com.fyfeng.android.annotations;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
public class AnnotationUtils {
private static final String tag = AnnotationUtils.class.getSimpleName();
public void init(final Activity activity) {
this.bindClick(activity);
}
public void bindClick(final Activity activity) {
Method[] methods = activity.getClass().getDeclaredMethods();
for (int k = 0; k < methods.length; k++) {
final Method m = methods[k];
Log.d(tag, "method[" + m.getName() + "]");
if (!m.isAnnotationPresent(ClickMethod.class)) {
continue;
}
ClickMethod click = m.getAnnotation(ClickMethod.class);
Log.d(tag, m.getName() + " 发现注解.");
final View view = activity.findViewById(click.id());
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
m.invoke(activity, new Object[] {});
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
使用示例:
package com.fyfeng.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.fyfeng.android.annotations.AnnotationUtils;
import com.fyfeng.android.annotations.ClickMethod;
public class MainActivity extends Activity {
private static final String tag = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AnnotationUtils autil = new AnnotationUtils();
autil.init(this);
}
@ClickMethod(id = R.id.text)
public void doClick() {
Log.d(tag, "----------------------");
}
@ClickMethod(id=R.id.text2)
public void doSecClick(){
Log.d(tag, "----------------------1");
}
}