----------------- android培训、java培训、期待与您交流! ----------
如何获取Class对象呢?
方式一:
- 通过对象的getClass方法进行获取。
- 麻烦在于每次是不是都需要具体的类和该类的对象,以及调用getClass方法。
Person p = new Person();
Class clazz = p.getClass();
方式二:
- 任何数据类型都具备着一个静态的属性class,这个属性直接获取到该类型的对应Class对象。
- 比第一种简单,不用创建对象,不用调用getClass方法。
- 但是还是要使用具体的类,和该类中的一个静态属性class完成。
Class clazz = Person.class;
方式三:
- 这种方式较为简单,只要知道的类的名称即可。
- 不需要使用该类,也不需要去调用具体的属性和行为。就可以获取到Class 对象了。
- 这种仅知道类名就可以获取该类字节码对象的方式,更有利于扩展。
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
通过Class创建对象:
1,查找并加载Person.class文件进内存,并将该文件封装成Class对象。
2,在依据Class对象创建该类具体的实例。
3,调用构造函数对对象进行初始化。
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();
如果指定的类中没有空参数的构造函数。或者要创建的类对象需要通过指定的构造函数进行初始化。
这时就不能使用newInstance方法了。既然要通过指定的构造函数进行对象的初始化。就必须先获取这个构造函数。
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
//获取指定类中的指定的构造函数。
Constructor constructor = clazz.getConstructor(String.class,int.class);
//创建对象。对象的建立都需要构造函数的初始化。 怎么创建对象可以通过构造器对象完成。
Object obj = constructor.newInstance("lisi",20);
如何获取字段,并对字段进行赋值和获取。
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
//获取该类中的名称为age的字段
Field ageField = clazz.getDeclaredField("age");
//System.out.println(ageField);
//想要给该变量赋值。 必须先要有对象。
Object obj = clazz.newInstance();
//对该私有字段进行取消权限检查的能力。
ageField.setAccessible(true);//暴力访问。
ageField.set(obj, 19);
Object o = ageField.get(obj);
System.out.println(o);
访问类中的方法
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("toString", null);
//获取能调用该方法的对象。
Object obj = clazz.newInstance();
Object returnValue = method.invoke(obj, null);
System.out.println(returnValue);
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("show", null);
method.invoke(null, null);
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("function", String.class,int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "haha",89);
Person类的代码:
public class Person {
private String name;
private int age;
public Person() {
super();
System.out.println("person run");
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String toString() {
return name+":"+age;
}
public static void show(){
System.out.println("person static show run");
}
public void function(String a,int b){
System.out.println("person param function "+a+","+b);
}
private void prviateShow(){
System.out.println("person private show run");
}
}
- 正则表达式:就是用操作字符串数据的规则表达式。
- 规则:就是用一些符号组成,每个符号都代表着特有的含义。其实这些符号想当于对应着底层一段代码。对外提供符号是简化了操作。
- 弊端:必须要先学习这些符号。符号多了,阅读性会较差。
正则表达式对字符串的常见操作:
1,匹配。
使用的是String类中的matchers方法。
2,切割。
使用的是String类中的split方法。
3,替换。
使用的是String类中的replaceAll方法。
4,获取。
将匹配的规则的内容获取出来。
使用到正则表达式对象。Pattern
使用步骤:
- 先将正则表达式编译成Pattern对象。
- 通过Pattern对象的matcher方法获取Matcher匹配器对象。
- 通过匹配器对象的方法,将正则规则作用到字符串上以便于操作。
需求:对QQ号进行校验。要求:5~15 位,不能以0开头,必须是数字。
regex = "[1-9][0-9]{4,14}";
package com.itheima.regex.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo3 {
public static void main(String[] args) {
checkTel();
splitDemo();
replaceAllDemo();
getDemo();
}
public static void getDemo(){
String str = "da jia zhu yi le ,yao pai wei dian ying la !";
String reg = "\\b[a-z]{3}\\b";//三个字母组成的单词都取出来。
//正则规则被编译成Pattern对象。
Pattern p = Pattern.compile(reg);
//通过正则对象的方法matcher和字符串想关联获取匹配器对象。
Matcher m = p.matcher(str);
//使用匹配器的方法对字符串进行操作。
while(m.find()){
System.out.println(m.start()+"---"+m.group()+"----"+m.end());
}
}
//替换演示。
public static void replaceAllDemo(){
// String str = "werqqtyuzzzio";
// str = str.replaceAll("(.)\\1+","$1");//后一个参数可以通过$数字 引用前一个参数中的组。
String str = "15812345678";
str = str.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
System.out.println(str);
}
//切割演示,
public static void splitDemo(){
// String str = "23 19 -1 9 56";
// String[] arr = str.split(" +");
// String str = "zhangsan.lisi.wangwu";
// String[] arr = str.split("\\.");
String str = "werqqtyuzzzio";
String[] arr = str.split("(.)\\1+");
for(String s : arr){
System.out.println(s);
}
}
//匹配演示。对手机号码进行校验。
public static void checkTel(){
String str = "158000001111";
String reg = "1[358]\\d{9}";
boolean b = str.matches(reg);
System.out.println(str+":"+b);
}
}
192.108.90.34 10.10.10.10 5.5.5.5 30.107.100.5
对ip地址字符串中的ip地址进行排序。按照ip的分类顺序
- 为了排序方便。最好让ip中的每一段都是三位,这样就可以用字典顺序进行排序了。
- 给每一段进行补零的操作。
- 而每一段需要的补的零又不一样多,咋办?
- 干脆,都按最多的两个零补。
- 然后在每一段保留最后三位。
String ip = "192.108.90.34 10.10.10.10 5.5.5.5 30.107.100.5";
ip = ip.replaceAll("(\\d+)", "00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
String[] ips = ip.split(" +");
Arrays.sort(ips);
for(String i : ips){
System.out.println(i.replaceAll("0*(\\d+)", "$1"));
}