java基础10:正则表达式与反射

来源:互联网 发布:淘宝抢购编辑脚本 编辑:程序博客网 时间:2024/05/16 15:10

 

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 一、正则表达式


一、概述

1、概念:

  正则表达式,又称正规表示法、常规表示法,计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

  许多程序设计语言都支持利用正则表达式进行字符串操作。

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2、作用

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

    1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

    2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

3、正则表达式的特点是:

    1. 灵活性、逻辑性和功能性非常的强;

    2. 可以迅速地用极简单的方式达到字符串的复杂控制。

    3. 对于刚接触的人来说,比较晦涩难懂。

 

二、常见功能

1,匹配

Stringmatches方法

<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,切割

Stringsplit()方法

<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,替换

StringreplaceAll()方法

<span style="white-space:pre"></span>/** * 替换 */private static void fun4() {String s1 = "afdfaaaaaaadfsfdssdafa";String s = s1.replaceAll("(.)\\1+", "$1");System.out.println(s);}



4,获取

Matcherfind()方法,查找下一个子序列

Matchergroup()方法,返回由以前匹配操作所匹配的输入子序列

/** * 获取 */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());}}


三、网页爬虫

网页爬虫听起来挺好玩,但是道理非常简单,就是在互联网上获取指定规则的数据

而这个指定规则可以使用正则表达式来写

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 = "\\w+@\\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);}


 三、最后


正则表达式用起来虽然简单,但是符合复杂,可读性差,不过呢,一些常见的字符串的正则表达式比如邮箱、身份证号等都可以在网上找的,拿过来用就好。

反射技术比较重要,反射还可以和抽象工厂模式结合做更换db用,反射的知识以后还会再讲到的。






2 0
原创粉丝点击