java基础—反射、正则
一、反射
定义:JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。
获取字节码对象的方式(三种):
1、 使用Object类中的getClass()方法的。
Class clazz=对象名.getClass();
2、任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
Class clazz=类名.Class;
3、只要通过给定的类的字符串名称就可以获取该类。
Class clazz=Class.forName(包名.类名);
获取 Class 对象所表示的类的一个新实例
获取空参数构造函数:
Object obj=Class.newInstance( );
获取指定的构造函数对象:
Constructor constructor=Class.getConstructor(参数类型.Class,…参数类型.Class );//获得一个构造器
Object obj=constructor.newInstance(传入实际参数);//通过该构造器对象的newInstance方法进行对象的初始化。
获取Class的字段
getField(String name):返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
getDeclaredField(String name): 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。(可访问私有属性)
Field类中的方法:
setAccessible(boolean flag):访问私有属性时,flag需设置为true。
set(Object obj, Object value) :将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
get(Object obj) :返回指定对象上此 Field 表示的字段的值。
获取Class中的方法:
第一种方法:
Method[] methods = Class.getMethods();//获取类中所有的公有方法。
Method[] methods= Class.getDeclaredMethods();//获取类中所有方法,包括
私有。第二种方法:
Method method = Class.getMethod(String name, 参数类型.Class,…参数类型.Class) ;// 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
示例:
- Person类:
public class Person
{
private String name;
private int age;
public Person(int age,String name)
{
super();
this.age=age;
this.name=name;
System.out.println("Person param run………"+this.name+":"+this.age);
}
public Person()
{
super();
System.out.println("Person run");
}
public void show()
{
System.out.println(name+"……show run……"+age);
}
private void privateMethod()
{
System.out.println("method run");
}
public void paramMethod(String str ,int num)
{
System.out.println("paramMethod run……"+str+":"+num);
}
public static void staticMethod()
{
System.out.println("static method run……");
}
}
- Class方法的演示:
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
class ReflectDemo1
{
public static void main(String[] args) throws Exception
{
String className="Person"; //类的字符串名称
Class clazz=Class.forName(className);//通过Class类中forName方法获得该类
Person p=(Person)clazz.newInstance();//调用空参数创建对象
System.out.println("------------");
Field field=clazz.getDeclaredField("age");//获取私有字段
field.setAccessible(true);//对私有字段的访问取消权限检查,暴力访问。
field.set(p,10);//设置Person对象中的age属性值
Object o=field.get(p);//获取age的值
System.out.println("获取的字段信息:"+field);//私有字段信息
System.out.println("设置的年龄:"+o);
System.out.println("------------");
Method method= clazz.getDeclaredMethod("privateMethod",null);//获取私有方法
method.setAccessible(true);//取消权限检查,暴力访问
method.invoke(p,null);//运行Person类中privateMethod方法
}
}
- 输出结果:
二、正则
特点:
正则表达式用于操作字符串数据。
通过一些特定的符号来体现的。
正则表达式常用构造摘要
字符类:
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
预定义字符类:
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词:
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
边界匹配器:
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
正则表达式常见功能:
- 匹配
- 其实使用的就是String类中的matches方法
- 切割
- 其实使用的就是String类中的split方法
- 替换
- 其实使用的就是String类中的replaceAll方法
- 获取
- 将正则规则进行对象的封装 ,通过正则对象的matcher方法与字符串相关联。
- 匹配
示例:
- 代码:
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
functionDemo_1();
System.out.println("------------");
functionDemo_2();
System.out.println("------------");
functionDemo_3();
System.out.println("------------");
functionDemo_4();
}
//演示匹配
public static void functionDemo_1()
{
//匹配手机号是否正确
String tel="13824955439";
//定义一个正则表达式
String reg="1[358]\\d{9}";
boolean b=tel.matches(reg);
System.out.println(tel+":"+b);
}
//演示切割
public static void functionDemo_2()
{
String str="zhaoshan xiaoqiang liliu";
//一个或多个空格
String reg=" +";
String[] names=str.split(reg);
for (String name:names )
{
System.out.println(name);
}
}
//演示替换
public static void functionDemo_3()
{
String str="13876535946";
//$1表示前一个参数的第一组,$3表示前一个参数的第三组
str=str.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$3");
System.out.println(str);
}
//演示获取
public static void functionDemo_4()
{
String str = "da jia hao,ming tian bu fang jia";
//\\b表示单词边界
String reg="\\b[a-z]{3}\\b";
//将正则表达式进行封装成对象
Pattern p=Pattern.compile(reg);
//通过正则对象获取匹配器对象
Matcher m=p.matcher(str);
//查找:find();
while (m.find())
{
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end());
}
}
}
- 输出结果: