一 xutils框架引入到AndroidStudio工程,最簡單的方法:
① 在APP的build.gradle里面加入 compile 'org.xutils:xutils:3.3.36'。
② 一定要自定義一個application.class
在自定義的application里的onCreate方法里面初始化xutils:
x.Ext.init(this);//初始化XUtils x.Ext.setDebug(BuildConfig.DEBUG);//是否輸出debug日志
③ 在manifest文件里面加入自己的application
<application android:name=".application.GlobalApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
④ 加入權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
其他的方法比如引入jar包引入lib自行百度。
二 xutils框架的注解
注解框架很好用,直接在activity或者fragment里面加入
@ViewInject(R.id.xxx)
private TextView mTvText;
注意,注解的時候一定要在onCreate之前,像聲明屬性和變量一樣。然后偶就好奇注解框架是怎么完成了用viewInject去完成findViewById這個操作的。就順便了解了一下注解是怎么一回事。
2.1 注解機制 其實就是java的反射實現的,我不在這里掉書袋解釋反射是啥,自行百度。下面就自己實現了一下用反射實現findViewById
① 新建一個@annotation類型的class ,如圖 ,

我們看到ViewInject的創建和接口差不多,但是別忘了前面的@和前面的聲明@Target和@Retention
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
int id () default -1;//控件ID,在某一個控件上面使用注解標注其ID
}
然后就是反射類InjectView的創建。類里面只有一個方法injectView(Activity activity)
public class InjectView {
public static void injectView(Activity activity) {
try {
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();//得到傳入的activity的所有字段
for(Field field:fields){
if(field.isAnnotationPresent(ViewInject.class)){
ViewInject inject = field.getAnnotation(ViewInject.class);
int id = inject.id();
if(id > 0 ){
field.setAccessible(true);
field.set(activity,activity.findViewById(id));
}
}
}
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (IllegalArgumentException e){
e.printStackTrace();
}
}
}
然后再在我的activity中使用我自己定義的注解
public class MainActivity extends AppCompatActivity {
@ViewInject(id = R.id.tv_text)
private TextView mTvText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectView.injectView(this);
mTvText.setText("ssssss");
}
}
可以看到我先注解聲明我的TextView,完成注解聲明后再利用InjectView.injectView(this),來完成整個注解。類里面用到了一個Field的類,就又好奇這個是干啥的(好奇寶寶),在剛接觸java的時候書上看到過Field就是對象的屬性,當時覺得就這么回事吧,但素,后面學習的時候又見過幾回,那時候沒怎么去真正的去深入了解,只知道跟反射有點關系,在網絡編程和數據庫掛鈎的一些代碼編寫里面出現的頻率太大!!!當時正年少輕狂,什么都是只是淺嘗輒止。如今追悔莫及!!扼腕長嘆!!!不廢話了,接下來熟悉Field
2.2 Field類的學習
在查看了一些文檔並自己寫了一個測試類之后,才明白,Field說白了其實就是類的屬性,是啊說的很在理(書上說的是沒錯的所以不能說書糊弄了你我)。通過它可以得到一個類的所有屬性的類型,父類型以及屬性值等等。
下面就是我寫的那個測試類:首先寫一個Student的實體
package bean;
import java.util.Date;
public class Students {
private String name ;
private String address;
private long id;
private Date birthday;
public String nickName;
@Override
public String toString() {
return "Students [name=" + name + ", address=" + address + ", id=" + id
+ ", birthday=" + birthday + ", nickName=" + nickName + "]";
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
然后就是針對這個實體進行Field的測試
package main;
import java.lang.reflect.Field;
import java.util.Date;
import bean.Students;
public class TestField {
public static void main(String[] args) {
Students student = new Students();
student.setName("John");
student.setNickName("pumpKing");
student.setBirthday(new Date());
student.setId(3501197405300359L);
try {
Field property1 = student.getClass().getDeclaredField("name");
Field property2 = student.getClass().getField("nickName");
Field property3 = student.getClass().getDeclaredField("birthday");
System.err.println(property1);
System.err.println(property2);
System.err.println(property3);
System.out.println("the superClass of Student is: "+student.getClass().getSuperclass());
System.out.println("the superClass of String is: "+property1.getClass().getSuperclass());
System.out.println("the superClass of Date is: "+property3.getClass().getSuperclass());
System.out.println("the classLoader of student is: "+student.getClass().getClassLoader().getClass().getName());
Field[] fields = student.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
System.out.println(field.get(student));
System.out.println(field);
}
System.out.println("origin = "+student.toString());
property2.set(student, "egg");//利用反射操作類的屬性
System.out.println("then = "+student.toString());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
下面是測試的結果
private java.lang.String bean.Students.name public java.lang.String bean.Students.nickName private java.util.Date bean.Students.birthday the superClass of Student is: class java.lang.Object the superClass of String is: class java.lang.reflect.AccessibleObject the superClass of Date is: class java.lang.reflect.AccessibleObject the classLoader of student is: sun.misc.Launcher$AppClassLoader John private java.lang.String bean.Students.name null private java.lang.String bean.Students.address 3501197405300359 private long bean.Students.id Tue Jun 14 14:45:45 CST 2016 private java.util.Date bean.Students.birthday pumpKing public java.lang.String bean.Students.nickName origin = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=pumpKing] then = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=egg]
okay,XUTils的注解就說到這里,畢竟這並不是它的重頭戲。
