反射機制{
定義:運行狀態,對任意的一個類,都能知道所有的屬性和方法。對於任意的對象,都能調用方法和屬性。動態獲取類中的信息
獲取類的字節碼對象:
1.Object中的getClass()方法,返回類的字節碼文件對象,弊端:要明確具體的類,並創建對象
2.任何數據類型都具備一個靜態屬性,即 類名.class來獲取對應的class對象,相對比較簡單,弊端還是需要明確用到類。
3.通過給定的字符串名稱,就可以獲取該類,即 Class.forName(“類的全稱包括包名”)
使用:
//獲取類名 String name = "reflect.test.Person"; //使用方法獲取類的字節碼文件對象,有可能拋出沒有與類名對應的類 Class cla = Class.forName(name); //使用Class的方法,創建新對象 Object ob = cla.newInstance(); //使用方法獲取類的構造函數,返回構造函數對象,再使用此對象創建對象 Constructor<Person> con = cla.getConstructor(String.class, int.class); con.newInstance("asf", 20); //使用方法獲取類的屬性 Field f = cla.getDeclaredField("age");//只能獲取本類,包括私有 f.setAccessible(true);//取消私有訪問檢查,即可以訪問私有屬性 f.set(ob, 32);//設置屬性值,需要指定對象,以及值 Object o = f.get(ob);//獲取該對象的該屬性 System.out.println(o); //獲取類的方法 Method m = cla.getMethod("show", null);//空參數方法 m.invoke(ob, null);//運行該空參數的方法 // m = cla.getDeclaredMethod("paramMethod", String.class, int.class);獲取帶參數的方法 // m.invoke(ob, "小強", 65);
}
正則表達式{
定義:用於操作字符串數據的通過一些特定符號體現的規則,操作簡單,閱讀性變差了
練習
public static void main(String[] args){ //定義一個字符串 // String str= "5135"; // //定義規則 // String regex = "[1-9][0-9]+"; // //判斷字符串是否符合規則 // boolean b = str.matches(regex); // System.out.println(b); // test_1(); //對ip地址排序 test_2(); } private static void test_2() { String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55"; ip_str = ip_str.replaceAll("(\\d+)", "00$1"); System.out.println(ip_str); ip_str = ip_str.replaceAll("0*(\\d{3})", "$1"); System.out.println(ip_str); String[] str = ip_str.split("( )+"); TreeSet t = new TreeSet(); for(int i=0; i<str.length; i++) t.add(str[i]); System.out.println(t); ip_str = ip_str.replaceAll("0*(\\d)", "$1"); System.out.println(ip_str); } private static void test_1() { String str = "我我..我我...我我我要.要要要要...要要要要..學學學學學...學學編編...編編編編..編..程程...程程...程程程"; //將多餘的子去除 str = str.replaceAll("\\.+", ""); System.out.println(str); str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str); }
}