1.
**
Android IOC框架实现
===============
** 本文简单介绍下如何实现编译期注解
介绍编译期注解,首先得介绍下如下两个注解
Target注解的功能就是表明你这个注解是用在什么地方的,它的值是一个枚举型
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或
enum声明
Retention注解的功能差不多说明的就是你的注解的生命周期吧,就是什么时候失效,它的值如下
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
第一部分,实现setContentView通过注解方式实现 setContentView注解类
package movie.select.seat.ioc;
import
java.lang.annotation.Documented;
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
/** * Created by Administrator on 2016/11/17/017. */ @Documented
@Target(value=ElementType.TYPE)
public @
interface ContentView {
int value();
}
通过注解实现setContentView功能的方法
public static void InjectView(Activity activity){
if (activity!=
null){
Class<? extends Activity> cls = activity.getClass();
ContentView annotation= cls.getAnnotation(ContentView.class);
int resid=annotation.value();
activity.setContentView(resid);
ViewInject(activity);
}
} 用于注解的Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
InjectUtil.InjectView(
this);
InjectUtil.ViewInject(
this);
}
实现findViewbyId注解
findViewbyId注解类
package movie.select.seat.ioc;
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
/** * Created by Administrator on
2016/11/17/017. */ @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @
interface ViewInJect {
int value(); }
通过注解实现findViewbyId的功能类
public static void ViewInject(Activity activity) {
if (activity!=
null){
Class<? extends Activity> cls = activity.getClass();
Field[] f=cls.getFields();
for (Field c: f){
if (c.isAnnotationPresent(ViewInJect.class)){
c.setAccessible(
true);
ViewInJect inject=c.getAnnotation(ViewInJect.class);
try {
c.set(activity,activity.findViewById(c.getAnnotation(ViewInJect.class).value()));
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
使用findViewbyId注解的Activity
package movie.select.seat.ioc;
import android.os.Bundle;
import
android.widget.Button;
import android.widget.Toast;
@ContentView(R.layout.activity_main)
public class MainActivity
extends BaseActivity {
@ViewInJect(R.id.btn)
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
InjectUtil.InjectView(
this);
InjectUtil.ViewInject(
this);
Toast.makeText(
this,btn.getText().toString(),Toast.LENGTH_LONG).show();
} } 点击事件注解
点击事件注解类
package movie.select.seat.ioc;
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
/** * Created by Administrator on 2016/11/17/017. */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @
interface OnClick {
int[] value(); }
点击事件注解使用方法
public static void setClick(
final Activity activity){
Class<? extends Activity> cls = activity.getClass();
Method[] method = cls.getMethods();
for (
final Method m :method){
if (m.isAnnotationPresent(OnClick.class)){
OnClick click=m.getAnnotation(OnClick.class);
int[] ids=click.value();
for (
int i : ids){
View view=activity.findViewById(i);
view.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
m.invoke(activity,view);
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
点击事件使用Activity
@OnClick(R.id.btn)
public void click(View view){
Toast.makeText(
this,
"1111",Toast.LENGTH_LONG).show();
}
转载请注明原文地址: https://ju.6miu.com/read-676910.html