----------------------- 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学习型技术博客、期待与您交流! ----------------------