反射机制{
定义:运行状态,对任意的一个类,都能知道所有的属性和方法。对于任意的对象,都能调用方法和属性。动态获取类中的信息
获取类的字节码对象:
1.Object中的getClass()方法,返回类的字节码文件对象,弊端:要明确具体的类,并创建对象
2.任何数据类型都具备一个静态属性,即 类名.class来获取对应的class对象,相对比较简单,弊端还是需要明确用到类。
3.通过给定的字符串名称,就可以获取该类,即 Class.forName(“类的全称包括包名”)
使用:
//获取类名 String name = "reflect.test.Person"; //使用方法获取类的字节码文件对象,有可能抛出没有与类名对应的类 Class cla = Class.forName(name); //使用Class的方法,创建新对象 Object ob = cla.newInstance(); //使用方法获取类的构造函数,返回构造函数对象,再使用此对象创建对象 Constructor<Person> con = cla.getConstructor(String.class, int.class); con.newInstance("asf", 20); //使用方法获取类的属性 Field f = cla.getDeclaredField("age");//只能获取本类,包括私有 f.setAccessible(true);//取消私有访问检查,即可以访问私有属性 f.set(ob, 32);//设置属性值,需要指定对象,以及值 Object o = f.get(ob);//获取该对象的该属性 System.out.println(o); //获取类的方法 Method m = cla.getMethod("show", null);//空参数方法 m.invoke(ob, null);//运行该空参数的方法 // m = cla.getDeclaredMethod("paramMethod", String.class, int.class);获取带参数的方法 // m.invoke(ob, "小强", 65);
}
正则表达式{
定义:用于操作字符串数据的通过一些特定符号体现的规则,操作简单,阅读性变差了
练习
public static void main(String[] args){ //定义一个字符串 // String str= "5135"; // //定义规则 // String regex = "[1-9][0-9]+"; // //判断字符串是否符合规则 // boolean b = str.matches(regex); // System.out.println(b); // test_1(); //对ip地址排序 test_2(); } private static void test_2() { String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55"; ip_str = ip_str.replaceAll("(\\d+)", "00$1"); System.out.println(ip_str); ip_str = ip_str.replaceAll("0*(\\d{3})", "$1"); System.out.println(ip_str); String[] str = ip_str.split("( )+"); TreeSet t = new TreeSet(); for(int i=0; i<str.length; i++) t.add(str[i]); System.out.println(t); ip_str = ip_str.replaceAll("0*(\\d)", "$1"); System.out.println(ip_str); } private static void test_1() { String str = "我我..我我...我我我要.要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程"; //将多余的子去除 str = str.replaceAll("\\.+", ""); System.out.println(str); str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str); }
}