Objects.equals(Object,Object)
防止參數(shù)為空垫桂,2者都為空返回ture,一個為null返回false
重寫一個equals的完整實例 (可以使用快捷鍵,快速生成,必須重新定義hashCode)
equals相同咒劲,hashCode也要相同
@Override
public boolean equals(Object obj) {
if (this==obj)return true;//代碼優(yōu)化继薛,
if (obj==null) return false;
//如果equals在每個子類中有所改變盖腿,就使用getClass檢測
if (getClass()!=obj.getClass()) return false;
//如果擁有統(tǒng)一語義爽待,就使用instance of
if (!(obj instanceof CategoryBean)) return false;
CategoryBean bean = (CategoryBean) obj;
return id==bean.id &&Objects.equals(name,bean.name);
}
枚舉類型
public enum Size {
SMALL,
MEDIUM,
LARGE,
EXTRA_LARGE
}
//返回String
Size.SMALL.toString();
//String 轉(zhuǎn)化枚舉
Size s = Enum.valueOf(Size.class, "SMALL");
Size[] values = Size.values();//返回枚舉數(shù)組
Size.SMALL.ordinal();//枚舉常量的位置,0開始
//出現(xiàn)在other之前翩腐,返回負數(shù)鸟款,=返回0,否則返回正數(shù)
Size.SMALL.compareTo(Size.LARGE);
反射對象
參考地址 http://mp.weixin.qq.com/s/bDe-6KiTbazC5FhUi-Z65A
一般書上的定義是這樣的:JAVA反射機制是在運行狀態(tài)中茂卦,對于任意一個類何什,都能夠知道這個類的所有屬性和方法;對于任意一個對象等龙,都能夠調(diào)用它的任意方法和屬性处渣;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制,這幾句解釋說明了反射的作用蛛砰,動態(tài)的跟類進行交互罐栈,比如獲取隱藏屬性,修改屬性泥畅,獲取對象荠诬,創(chuàng)建對象或者方法等等,總之就一句話:
反射是一種具有與類進行動態(tài)交互能力的一種機制 為什么要強調(diào)動態(tài)交互呢?
因為一般情況下都是動態(tài)加載柑贞,也就是在運行的時候才會加載方椎,而不是在編譯的時候,在需要的時候才進行加載獲取钧嘶,或者說你可以在任何時候加載一個不存在的類到內(nèi)存中棠众,然后進行各種交互,或者獲取一個沒有公開的類的所有信息,換句話說有决,開發(fā)者可以隨時隨意的利用反射的這種機制動態(tài)進行一些特殊的事情摄欲。
//根據(jù)類型來創(chuàng)建一個對象
try {
Class s = Class.forName("com.zcits.highwayplatform.model.bean.ChartBean");
Object beans = s.newInstance();//調(diào)用默認構(gòu)造器構(gòu)建對象
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
因此反射的組成一般有下面幾個方面組成:
1.java.lang.Class.java:類對象;
2.java.lang.reflect.Constructor.java:類的構(gòu)造器對象疮薇;
3.java.lang.reflect.Method.java:類的方法對象;
4.java.lang.reflect.Field.java:類的屬性對象我注;
實例參考
public class Student {
private int age;//年齡
private String name;//姓名
private String address;//地址
private static String sTest;
public Student() {
throw new IllegalAccessError("Access to default Constructor Error!");
}
private Student(int age, String name, String address) {
this.age = age;
this.name = name;
this.address = address;
sTest = "測試反射";
}
private int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private String getAddress() {
return address;
}
private void setAddress(String address) {
this.address = address;
}
private static String getTest() {
return sTest;
}
}
反射運行
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("ClassLoader.Student");
//返回本地的這個構(gòu)造器
Constructor constructors=clazz.getDeclaredConstructor(int.class,String.class,String.class);
constructors.setAccessible(true);//申請權(quán)限訪問私有
//利用構(gòu)造器生成對象實例
Object mStudent=constructors.newInstance(27,"小文","北京市海定區(qū)XX號");
System.out.println(mStudent.toString());
//獲取隱藏的int屬性
Field mAgeField=clazz.getDeclaredField("age");
mAgeField.setAccessible(true);//申請權(quán)限訪問私有
int age= (int) mAgeField.get(mStudent);
System.out.println("年齡為:"+age);
//調(diào)用隱藏的方法
Method getAddressMethod=clazz.getDeclaredMethod("getAge");
getAddressMethod.setAccessible(true);
int newage= (int) getAddressMethod.invoke(mStudent);//調(diào)用實例方法一定需要一個類的實例
System.out.println("年齡為:"+newage);
//調(diào)用靜態(tài)方法
Method getTestMethod=clazz.getDeclaredMethod("getTest");
getTestMethod.setAccessible(true);
String result= (String) getTestMethod.invoke(null);//靜態(tài)方法的話按咒,那么第一個參數(shù)是為null
System.out.println("調(diào)用靜態(tài)方法:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}