Java第二十七天学习笔记~(反射、正则表达式)

反射

Java反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法

对于任意一个对象都能够调用他的任意一个方法和属性

这种动态获取信息及动态调用对象的方法的功能称为Java语言的反射机制

动态获取类中信息就是Java反射

可以理解为对类的解剖

反射技术提高了我们程序的扩展性

给用户提供的我们之间的桥梁是配置文件(web.xml)

我们主要开发的是接口和配置文件

想要对一个类进行解剖,只要获得该文件类的字节码文件对象即可

package cn.itcast.reflect.demo;

import cn.itcast.bean.Person;

/*
 * 
 * 如何获取字节码文件对象呢?
 */

public class ReflectDemo {

	public static void main(String[] args) throws ClassNotFoundException {
		// TODO Auto-generated method stub
		getClassObject_3();
	}	
	
	/*
	 * 方式三
	 * 3,只要通过给定的类的字符串名称就可以获取该类,更为扩展
	 * 可使用Class类中的方法完成
	 * 该方法就是fotName
	 * 这种方式只要有名称即可,更为方便,扩展性;更强
	 */
	public static void getClassObject_3() throws ClassNotFoundException {
		String className="cn.itcast.bean.Person";
		Class clazz=Class.forName(className);
		System.out.println(clazz);
	}
	
	
	
	/*
	 *方式二
	 *2,任何数据类型都具备一个静态的属性。class来获取其对应的class对象 
	 * 相对简单,但还是要明确用到类中的静态成员
	 * 还是不够扩展
	 */
	private static void getClassObject_2() {
		
		Class clazz=Person.class;
		
		Class clazz1=Person.class;
		System.out.println(clazz==clazz1);
	}
	
	
	
	/*
	 * 获取字节码对象的方式:
	 * 方式一,Object类中的getClass()方法
	 * 想要用这种方式,必须要明确具体的类,并创建对象
	 * 麻烦
	 * 
	 */
	
	
	public static void getClassObject_1() {
		Person p=new Person();
		Class clazz=p.getClass();
		
		Person p1=new Person();
		Class clazz1=p1.getClass();
		
		System.out.println(clazz==clazz1);
		
	}
}

获取字节码文件中的字段

import java.lang.reflect.Field;

public class ReflectDemo3 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		getFiledDemo();
	}
	/*
	 * 获取字节码文件中的字段
	 */
	public static void getFiledDemo() throws Exception {
		// TODO Auto-generated method stub
		Class clazz=Class.forName("cn.itcast.bean.Person");
		
		Field field=null;//clazz.getField("age");  只能获取共有的
		
		field=clazz.getDeclaredField("age");
		
       //对私有字段的访问取消权限检查----暴力访问
		  field.setAccessible(true);
		Object obj=clazz.newInstance();
		
		field.set(obj,89);
		
		Object o=field.get(obj);
		//field=clazz.getDeclaredField("age");//只获取本类,但包含私有的
		
		System.out.println(o);
	}
	
}

获取Class中的方法

//获取Class中的方法
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import cn.itcast.bean.Person;

public class ReflectDemo4 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		getMdethodDemo3();
	}
	private static void getMdethodDemo3() throws Exception {
		// TODO Auto-generated method stub
		Class clazz=Class.forName("cn.itcast.bean.Person");
		Method method=clazz.getMethod("paramMrthod", String.class,int.class);
		
		Object obj=clazz.newInstance();
		
		method.invoke(obj, "小强",88);
	}
	
	private static void getMdethodDemo2() throws Exception {
		// TODO Auto-generated method stub
		Class clazz=Class.forName("cn.itcast.bean.Person");
		Method method=clazz.getMethod("show", null);//获取空参一般方法
		
		Constructor constructor=clazz.getConstructor(String.class,int.class);
		
		Object obj=constructor.newInstance("小明",33);
		method.invoke(obj, null);
		//Person p=new Person();
		//p.show();
	}
	/*
	 * 获取指定Class中的公共函数
	 */
	private static void getMdethodDemo() throws Exception {
		// TODO Auto-generated method stub
		Class clazz=Class.forName("cn.itcast.bean.Person");
		
		Method[] methods=clazz.getMethods();
		for(Method method:methods) {
			System.out.println(method);
		}
	}

}

练习主机运行

主程序

package cn.itcast.reflect.test;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

/*
 * 电脑运行
 */
public class ReflectTest {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Mainboard mb=new Mainboard();
		mb.run();
		//每次添加一个设备都要修改代码传递一个新创建的对象
	//	mb.usePCI(new SoundCard());
		//能不能不修改代码就可以完成这个动作
		//不用new来完成,而只是获取其class文件,在内部实现创建对象的动作
		
		File configFile=new File("pci.properties");
		
		Properties  prop=new Properties();
		FileInputStream fis=new FileInputStream(configFile);
		
		prop.load(fis);
		
		for(int x=0;x<prop.size();x++) {
			
			String pciName=prop.getProperty("pci"+(x+1));
			
			Class clazz=Class.forName(pciName);//用Class去加载这个PCI子类
			PCI p=(PCI)clazz.newInstance();
			
			mb.usePCI(p);
		}
		fis.close();
	}

}

主板

package cn.itcast.reflect.test;

public class Mainboard {
	
	public void run() {
		System.out.println("main board run....");
	}
	public void  usePCI(PCI p) {//PCI  p=new SoundCard();
		if(p!=null) {
		p.open();
		p.close();
		}
	}
}

PCI接口

package cn.itcast.reflect.test;

public interface PCI {
	
	public void open();
	public void close();

}

声卡

package cn.itcast.reflect.test;

public class SoundCard implements PCI {
	public void open() {
		System.out.println("sound open");
	}
	public void close() {
		System.out.println("sound close");
	}
}

pci.properties  接口配置文件

pci1=cn.itcast.reflect.test.SoundCard

正则表达式

来操作字符串

    String qq="1234567";
    String regex="[1-9][0-9]{4,14}";  //正则表达式
    loolean b=qq.matches(regex);
    System.out.println("qq+":"+b);

通过一些特定的符号来实现的,所以我们为了掌握正则表达式,必须要学习一些符号

常见功能:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {
	public static void main(String[] args) {
		
		/*
		 * 正则表达式对字符串的常见操作:
		 * 1,匹配
		 * 		其实使用的就是String类中的matches方法
		 * 2,切割
		 * 		其实使用的就是String类中的split方法
		 * 3,替换
		 * 
		 * 4,获取
		 * 
		 */
		functionDemo_4();
	}
	/*
	 * 获取
	 * 	将正则规则进行对象的封装
	 * Pattern p=Pattern.compile("a*b");
	 * 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配对象Matcher
	 * Matcher m=p.matcher("aaaaab");
	 *  //通过Matcher匹配器对象的方法对字符创进行操作
	 *  boolean b=m.matches();
	 */
	private static void functionDemo_4() {
		// TODO Auto-generated method stub
		String str="da jia hao ,ming tian bu fang jia!";
		
		String regex="[a-z]{3}";
		//1.将正则封装成对象
		Pattern p=Pattern.compile(regex);
		//2.通过正则对象获取匹配器对象
		Matcher m=p.matcher(str);
		//使用Matcher对象的方法对字符串进行操作
		//既然要获取三个字母组成的单词
		//查找 find();
		System.out.println(str);
		while(m.find()){
		System.out.println(m.group());//获取匹配的子序列
		
		System.out.println(m.start()+":"+m.end());
		}
	}
		
	/*
	 * 替换
	 */
	private static void functionDemo_3() {
		// TODO Auto-generated method stub
		String str="zhanganttttxiaoqiangmmmmzhaoliu";
	//	str=str.replaceAll("(.)\\1+", "#");  //  (.)\\1+ 叠词 替换
		str=str.replaceAll("(.)\\1+", "$1");  //  $获取前一个参数的第一组
		System.out.println(str);
	}

	/*
	 * 切割
	 */
	private static void functionDemo_2() {
		// TODO Auto-generated method stub
		String str="zhangsan    xiaoqiang     zhaoliu";
		String[] names=str.split(" +");//  +一个或者多个
		
		for(String name:names) {
			System.out.println(name);
		}
	}
	
	
	
	/*
	 * 演示匹配
	 */
	public static void functionDemo_1() {
		// TODO Auto-generated method stub
		//匹配手机号码是否正确
		String tel="15800001111";
		
		String regex="1[358][0-9]{9}";   //  "\\d"=\d=[0-9]
		boolean b=tel.matches(regex);
		System.out.println(tel+":"+b);
		
	}
}

练习(切割替换)

package cn.itcast.regex.test;

public class RegexTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * 1,治疗口吃:我我我我.....我我要....要要要...要要学学....学学学编编编...编编编程
		 * 2,对IP地址排序
		 * 3,对邮件地址校验
		 */
		test_1();
	}

	private static void test_1() {
		// TODO Auto-generated method stub
		String str="我我我我.....我我要....要要要...要要学学....学学学编编编...编编编程";
		//1,将字符串中.去掉---替换
		str=str.replaceAll("\\.", "");
		System.out.println(str);
		//2,将叠词替换
		str=str.replaceAll("(.)\\1+", "$1");
		System.out.println(str);
	}
	

}

猜你喜欢

转载自blog.csdn.net/crazyhulu/article/details/86127181