Skip to content

Latest commit

 

History

History
81 lines (67 loc) · 4.22 KB

README.md

File metadata and controls

81 lines (67 loc) · 4.22 KB

AndroidIOC


Java SE5内置了三种注解 @Override,覆盖超类中的方法。@Deprecated,不赞成使用代码(过时)编译器会发出警告。@SUppressWarnings关闭编译器发出的警告

Java提供的注解:

#@Target 注解可以用在什么位置 ElementType参数有

  1. CONSTRUCTOR:构造器声明
  2. FIELD:域声明(包括enum实例)
  3. LOCAL_VARIABLE:局部变量声明
  4. METHOD:方法声明
  5. PACHAGE:包声明
  6. PARAMETER:参数声明
  7. TYPE:类、接口(注解类型)enum声明

#@Retention 保存注解信息的级别,RetentionPolicy参数有

  1. SOURCE:注解被编译器丢弃
  2. CLASS:注解在class文件中,但会被VM抛弃
  3. RUNTIME:vm运行期间保留注解,可以通过反射读取注解信息。

#@Document 将注解包含至javadoc中

#@Inherited 允许之类继承父类的注解

#code

  • @Target(ElementType.FIELD)
  • @Retention(RetentionPolicy.RUNTIME)
  • public @interface Test {
  • int value() default -1;
  • String valueString() default "abc";
  • }

在Android开发中使用@Retention(RetentionPolicy.RUNTIME)通过反射设置Activity中的控件用布局ID,这样做可以减少代码使得整体看起来清洁漂亮。 AndroidICO是一个使用注解设置获取控件和布局ID的实例,、

  1. 获取成员控件View通过fianViewById动态获取
  • private static void injectViews(Activity activity) {
  •   Class<? extends Activity> clazz = activity.getClass();
    
  •   // 获取这个类里面的所有成员属性
    
  •   Field[] fields = clazz.getDeclaredFields();
    
  •   for (Field field : fields) {
    
  •   	ViewInJect inJect = field.getAnnotation(ViewInJect.class);
    
  •   	if (inJect != null) {
    
  •   		int viewId = inJect.value();
    
  •   		if (viewId != -1) {
    
  •   			try {
    
  •   				Method method = clazz.getMethod("findViewById",
    
  •   						int.class);
    
  •   				Object resView = method.invoke(activity, viewId);
    
  •   				field.setAccessible(true);
    
  •   				field.set(activity, resView);
    
  •   			} catch (Exception e) {
    
  •   			}
    
  •   		}
    
  •   	}
    
  •   }
    
  • }
  1. 动态设置布局Id
  • private static void injectContentView(Activity activity) {
  •   Class<? extends Activity> clazz = activity.getClass();
    
  •   ContentView contentView = clazz.getAnnotation(ContentView.class);
    
  •   if (contentView != null) {
    
  •   	int contentViewLayoutID = contentView.value();
    
  •   	try {
    
  •   		Method method = clazz.getMethod("setContentView", int.class);
    
  •   		method.setAccessible(true);
    
  •   		method.invoke(activity, contentViewLayoutID);
    
  •   	} catch (Exception e) {
    
  •   	}
    
  •   }
    
  • }