关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、正则表达式
一、概述
1、概念:
正则表达式,又称正规表示法、常规表示法,计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2、作用
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
3、正则表达式的特点是:
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());
}
}
三、网页爬虫
网页爬虫听起来挺好玩,但是道理非常简单,就是在互联网上获取指定规则的数据
而这个指定规则可以使用正则表达式来写
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用,反射的知识以后还会再讲到的。