Java SE5内置了三种注解 @Override,覆盖超类中的方法。@Deprecated,不赞成使用代码(过时)编译器会发出警告。@SUppressWarnings关闭编译器发出的警告
Java提供的注解:
#@Target 注解可以用在什么位置 ElementType参数有
- CONSTRUCTOR:构造器声明
- FIELD:域声明(包括enum实例)
- LOCAL_VARIABLE:局部变量声明
- METHOD:方法声明
- PACHAGE:包声明
- PARAMETER:参数声明
- TYPE:类、接口(注解类型)enum声明
#@Retention 保存注解信息的级别,RetentionPolicy参数有
#@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的实例,、
- 获取成员控件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) {
-
}
-
}
-
}
-
}
- }
- 动态设置布局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) {
-
}
-
}
- }