黑马程序员--反射与正则表达式

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

反射与正则表达式

(一)  反射

1,含义:JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

简单的说:能动态获取类中信息(想要获取一个类文件的内容,只要获取到该类的字节码文件对象即可),就是java反射。

2,应用场景:如果一个应用程序想要扩展其功能,一般情况下,应用的程序都会提供接口供其扩展功能,那么,我们需要在配置文件中将已经做好的程序加载进来,也就是说:获取指定名称的字节码文件进行加载并获取其中的内容并调用,这个时候使用到的就是反射技术。

3,好处:

(1)      提高了程序的扩展性

4,获取Class对象的三种方式:

(1)       Object类中的getClass()方法的(想要用这种方式,必须要明确具体的类,并创建对象,这样做的话是比较麻烦的)

(2)       任何数据类型都具备一个静态的属性.class来获取其对应的Class对象(相对简单,但是还是要明确用到类中的静态成员,还是不够扩展)

(3)       只要通过给定的类的字符串名称就可以获取该类,更为扩展。可以用Class类中的方法完成。该方法就是forName,这种方式只要有名称即可,更为方便,扩展性更强。

5,获取Class中的构造函数

(1)       当构造函数是空参数

String name = "cn.itcast.bean.Person";

          //找寻该名称类文件,并加载进内存,并产生Class对象。

          Class clazz = Class.forName(name);

          //如何产生该类的对象呢?

          Object obj  = clazz.newInstance();//调用空参数的构造函数

(2)       当构造函数是有参数的

分析:既然是通过指定的构造函数进行对象的初始化,所以应该先获取到该构造函数。通过字节码文件对象即可完成。该方法是:getConstructor(paramterTypes);

String name = "cn.itcast.bean.Person";

              //找寻该名称类文件,并加载进内存,并产生Class对象。

              Classclazz = Class.forName(name);

              //获取到了指定的构造函数对象。

              Constructorconstructor = clazz.getConstructor(String.class,int.class);

              //通过该构造器对象的newInstance方法进行对象的初始化。

              Objectobj = constructor.newInstance("小明",38);

6,获取Class中的字段

Field field = clazz.getField("age");//只能获取公有的

Field field =clazz.getDeclaredField("age");//只获取本类,但包含私有属性的对象

//对私有字段的访问取消权限检查。暴力访问。

              field.setAccessible(true);

7,获取Class中的方法

1)获取指定Class中的所有公共函数。

              Class clazz =Class.forName("cn.itcast.bean.Person");

              Method[]methods  = clazz.getMethods();//获取的都是公有的方法。

              methods= clazz.getDeclaredMethods();//只获取本类中所有方法,包含私有。

2)获取空参数一般方法

Method method = clazz.getMethod("show", null);//获取空参数一般方法。

3)获取有参数的方法

Class clazz =Class.forName("cn.itcast.bean.Person");

           Method method =clazz.getMethod("paramMethod", String.class,int.class);//获取有参数的paramMethod方法

           Object obj =clazz.newInstance();//创建一个实例

           method.invoke(obj,"小强",89);//赋值

 

(二)  正则表达式

1, 特点:

1)正则表达式用于操作字符串数据。

   2)通过一些特定的符号来体现的。

2,常见的功能

1)匹配。

               其实使用的就是String类中的matches方法。

2)切割。

               其实使用的就是String类中的split方法。

3)替换。

            其实使用的就是String类中的replaceAll()方法。

友情提示:

1)对于String的替换,当一个字符串中出现重叠元素的时候,我们可以使用组的概念进行获取,使用"$1"该符号将重叠的元素替换成一个元素

2)我们经常看到电话号码的显示是:158****1111;中的四个数字被隐式了,这个时候,我们可以根据替换的原理进行操作:

String tel ="15800001111";//158****1111;

                            tel =tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");    //将号码分成3组,使用$1符号,将中间四个号码使用*替换,只显示头与尾部分

                            System.out.println(tel);

4)获取

思路:

       Pattern p = Pattern.compile("a*b");//将正则规则进行对象的封装。

         Matcher m = p.matcher("aaaaab");  //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher .

         boolean b =m.matches();//通过Matcher匹配器对象的方法对字符串进行操作。

               

3,网页爬虫

网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。

案例:爬取邮箱地址

思路:

1, 读取源文件。

2, 对读取的数据进行规则的匹配。从中获取符合规则的数据

3, 将符合规则的数据存储到集合中

       //1,读取源文件(本地磁盘下一个网页)。

//            BufferedReaderbufr = new BufferedReader(new FileReader("c:\\mail.html"));

              URLurl = new URL("http://192.168.1.100:8080/myweb/mail.html");//读取的是网络中指定网页的内容

              BufferedReaderbufIn = new BufferedReader(new InputStreamReader(url.openStream()));           

              //2,对读取的数据进行规则的匹配。从中获取符合规则的数据.

              Stringmail_regex = "\\w+@\\w+(\\.\\w+)+";//邮箱的规则

              List<String>list = new ArrayList<String>();//定义一个集合

              Patternp = Pattern.compile(mail_regex);//将正则规则进行对象的封装

              Stringline = null;

              while((line=bufIn.readLine())!=null){//读取内容

                     Matcherm = p.matcher(line);//通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher

                     while(m.find()){//读取一行查询匹配数据

                            //3,将符合规则的数据存储到集合中。

                            list.add(m.group());

                     }

              }

              returnlist; //返回集合中的数据

 

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值