標籤:javase Regex 反射
關於Java基礎的文章,我覺得寫得還可以,以前發在了我其它的部落格了,肯定是原創,現在再分享給大家出來。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、Regex
一、概述1、概念:
Regex,又稱正規標記法、常規標記法,電腦科學的一個概念。Regex使用單個字串來描述、匹配一系列符合某個句法規則的字串。在很多文字編輯器裡,Regex通常被用來檢索、替換那些符合某個模式的文本。
許多程式設計語言都支援利用Regex進行字串操作。
Regex是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。
2、作用
給定一個Regex和另一個字串,我們可以達到如下的目的:
1. 給定的字串是否符合Regex的過濾邏輯(稱作“匹配”);
2. 可以通過Regex,從字串中擷取我們想要的特定部分。
3、Regex的特點是:
1. 靈活性、邏輯性和功能性非常的強;
2. 可以迅速地用極簡單的方式達到字串的複雜控制。
3. 對於剛接觸的人來說,比較晦澀難懂。
二、常見功能1,匹配
String的matches方法
<span style="white-space:pre"></span>/** * qq號校正 需求:長度5-15的數字,不能以0開頭 */private static void fun2() {String s = "023";boolean b = s.matches("[1-9][0-9]*{4,14}");b = s.matches("[1-9]\\d*{4,14}");// 相等System.out.println(b);}
2,切割
String的split()方法
<span style="white-space:pre"></span>/** * 切割方法 */private static void fun3() {// 切割空格String s = "afdf dfsfd dafa";String[] names = s.split(" +");for (String name : names) {System.out.println(name);}// 切割疊詞String s1 = "afdfaaaaaaadfsfdssdafa";String[] myNames = s.split("(.)\\1+");for (String name : myNames) {System.out.println(name);}}
3,替換
String的replaceAll()方法
<span style="white-space:pre"></span>/** * 替換 */private static void fun4() {String s1 = "afdfaaaaaaadfsfdssdafa";String s = s1.replaceAll("(.)\\1+", "$1");System.out.println(s);}
4,擷取
Matcher的find()方法,尋找下一個子序列
Matcher的group()方法,返回由以前匹配操作所匹配的輸入子序列
/** * 擷取 */private static void fun5() {Pattern p = Pattern.compile("a*b");//將正則規則封裝成對象Matcher m = p.matcher("aaaaabaaabdfdfaaabss");//匹配的字串封裝成對象boolean b = m.matches();//m.find();//System.out.println(m);while(m.find()){System.out.println(m.group());}}
三、網頁爬蟲
網頁爬蟲聽起來挺好玩,但是道理非常簡單,就是在互連網上擷取指定規則的資料
而這個指定規則可以使用Regex來寫
public class PaChong {public static void main(String[] args) throws Exception {List<String> list = fun1();for (String name: list) {System.out.println(name);}}/** * @throws Exception * */private static List<String> fun1() throws Exception {URL url = new URL("http://127.0.0.1:8080/myweb/test.html");InputStream in = url.openStream();BufferedReader bufr = new BufferedReader(new InputStreamReader(in));ArrayList<String> list = new ArrayList<String>();String main_rgex = "\\[email protected]\\w+(\\.\\w+)+";Pattern p =Pattern.compile(main_rgex);String line = null;while((line = bufr.readLine()) != null){Matcher m = p.matcher(line);while(m.find()){list.add(m.group());}}return list;}}
二、反射
一,概述
1、定義
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意一個方法和屬性;
這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。
動態擷取類中資訊,就是java反射 。
2、反射好處
反射技術大大提高了程式的擴充性
3、Java反射機制主要提供了以下功能:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變數和方法;
在運行時調用任意一個對象的方法;
產生動態代理
二、擷取Class對象
public static void getClassObject_3() throws ClassNotFoundException {String className = "cn.itcast.bean.Person";Class clazz = Class.forName(className);System.out.println(clazz);}
三、擷取Class中的建構函式
<span style="white-space:pre"></span>/** * 建立有參數的執行個體 * @throws Exception */private static void fun2() throws Exception {String name = "jinfulin.b.bean";Class clazz = Class.forName(name);Constructor cons = clazz.getConstructor(String.class,int.class);Object obj = cons.newInstance("sf",21);}/** * 建立一個新的無參的執行個體 */private static void fun1() throws ClassNotFoundException,InstantiationException, IllegalAccessException {String name = "jinfulin.p.bean.Person";Class clazz = Class.forName(name);Object obj = clazz.newInstance();//建立一個新的無參的執行個體System.out.println(obj);}
四、擷取Class中的欄位
Field field = null;clazz.getField("age");//只能擷取公有的field = clazz.getDeclaredField("age");//只擷取本類,但包含私人。//對私人欄位的訪問取消許可權檢查。暴力訪問。field.setAccessible(true);private static void getFileDemo() throws Exception {Class clazz = Class.forName("jinfulin.p.bean.Person");Field field = null;field = clazz.getDeclaredField("name");//只擷取本類,但包含的私人欄位。field.setAccessible(true);//對私人欄位的訪問取消許可權檢查。暴力訪問。Object obj = clazz.newInstance();field.set(obj, "金福林");Object o = field.get(obj);System.out.println(o);}
四、擷取Class中的方法
<span style="white-space:pre"></span>Method[] methods = clazz.getMethods();//擷取的都是公有的方法。 methods = clazz.getDeclaredMethods();//只擷取本類中所有方法,包含私人。 method.invoke(obj, "小強",89);//設定參數值public static void getMethodDemo_3() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Object obj = clazz.newInstance();Method method = clazz.getMethod("paramMethod", String.class,int.class);method.invoke(obj, "小強",89);}
三、最後
Regex用起來雖然簡單,但是符合複雜,可讀性差,不過呢,一些常見的字串的Regex比如郵箱、社會安全號碼等都可以在網上找的,拿過來用就好。
反射技術比較重要,反射還可以和抽象原廠模式結合做更換db用,反射的知識以後還會再講到的。
java基礎10:Regex與反射