1、理解Class類java
一、java程序中的各個java類屬於一類事物,描述這類事物的java類名就叫作Class數組
二、Class類表明java類,而他的各個對象表明各個類在內存中的字節碼。一個類被類加載器加載到內存中,佔用內存一片空間,這個空間裏的內容就是類的字節碼。不一樣類的字節碼是不一樣的。因此他們在內存裏的內容是不一樣的。這一個個空間分別用一個個對象來表示,這裏的對象就是Class類的對象緩存
三、如何獲得Class類型(類的字節碼)ui
類名.class,例如,System.class
對象.getClass(),例如,new Date().getClass()
Class.forName("類名"),例如,Class.forName("java.util.Date");this
Point point = new Point(); Class clazz1 = point.getClass(); Class clazz2 = Point.class; Class clazz3 = Class.forName("test.java.com.day1.Point"); System.out.println(clazz1==clazz2);//輸出true System.out.println(clazz1==clazz3);//輸出true
例一、判斷是否是數組code
String[] a= new String[]{"1","2","3"}; if(a.getClass().isArray()){ System.out.println(Arrays.asList(a)); }
2、反射對象
一、什麼是反射內存
反射就是將java類中的各個成分映射成相應的java類字符串
例如,一個java程序中的java類用一個Class類的對象來表示,一個類中的組成部分:成員變量,方法,構造方法,包等等信息也用一個個的Java類來表示,就像汽車是一個類,汽車中的發動機,變速箱等等也是一個個的類。表示java類的Class類顯然要提供一系列的方法,來得到其中的變量,方法,構造方法,修飾符,包等信息,這些信息就是用相應類的實例對象來表示,它們是Field、Method、Contructor、Package等等。
二、Constructor類get
Constructor類表明某個類中的一個構造方法
//獲得某個類的全部構造方法
Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
//獲得某個構造方法
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuilder.class);
建立實例對象:
一般方式:String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));
//調用得到的方法時要用到上面相同類型的實例對象
Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
該方法內部先獲得默認的構造方法,而後用該構造方法建立實例對象。
該方法內部的具體代碼是怎樣寫的呢?用到了緩存機制來保存默認構造方法的實例對象。
三、Field類表明某個類中的一個成員變量
class Point{ private int pointx=0; private int pointy=1; } Field fieldx = Point.class.getField("pointx"); System.out.println(fieldx.get(new Point())); Field fieldy = Point.class.getDeclaredField("pointy"); fieldy.setAccessible(true); System.out.println(fieldy.get(new Point()));
/** * 將任意一個對象中的全部String類型的成員變量所對應的字符串內容中的"b"改爲"a"。 * @author chenweisong * */ class Stringreplace{ private String a = "abstract"; public String b = "aabbcccbf"; int c=2; public String toString(){ System.out.println(a+"\r\n"+b+"\r\n"+c); return null; } public void replaceAll() throws Exception{ Field[] fields = Stringreplace.class.getDeclaredFields(); for(Field field:fields){ field.setAccessible(true); if(field.getType()==java.lang.String.class){ String str = (String)field.get(this); field.set(this, str.replace("b", "a")); } } System.out.println(this); } }
四、Method類表明某個類中的一個成員方法
//獲得一個類的方法
Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class); String str = "abc"; System.out.println(str.charAt(1)); System.out.println(charAt.invoke(str, 1));
五、數組的反射
具備相同維數和元素類型的數組屬於同一個類型,即具備相同的Class實例對象。表明數組的Class實例對象的getSuperClass()方法返回的父類爲Object類對應的Class。基本類型的一維數組能夠被看成Object類型使用,不能看成Object[]類型使用;非基本類型的一維數組,既能夠當作Object類型使用,又能夠當作Object[]類型使用。