了解反射
java反射机制:内存中获取java中的属性和方法的操作。
首先反射的一个类用于操作反射:Class - java.lang包下
获取类:我们操作中的new关键字其实在java的内存中作了几件事:**
- 先找到构造函数(有参、无参)
- 反射中私有属性不一定要提供set/get方法,因为在反射中我们不需要调用方法,直接在构造函数中处理就可以。
- 反射中能够调用方法,利用method对象进行方法的处理
- 反射中获取类的方式有三种,但是这些获取到的类一定是同一个:==比较时true,地址的指向一致
- 反转中可以获取私有的和公有的字段
反射处理公共字段
package review;import org.junit.Test;import java.lang.reflect.Field;/*** 反射用于处理属性** 利用Student进行操作*/public class FieldTest1 {@Test//这个方法的返回值只能是void,并且不能传参public void test1(){//常规的给类中public字段赋值Student s = new Student();s.setId(11);System.out.println(s);}//反射处理公共字段@Testpublic void test2() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {//1.获取反射类 - Class对象Class cla = Class.forName("review.Student");//2.创建该类的实例Object s1 = cla.newInstance();System.out.println(s1);//Student{id=0, name='null'}//3.处理字段 - java.lang.reflect.FieldField f_id = cla.getField("id");System.out.println(f_id);//public int review.Student.id//4.赋值 - 第一个参数是当前所在的类,第二个参数是值f_id.set(s1,30);System.out.println(s1);//Student{id=30, name='null'}//5.获取字段的值Object id_value = f_id.get(s1);System.out.println(id_value);//30}}
反射处理私有字段
使用的方法getDeclaredField(); (带有Declared的方法)
赋值操作要先破解访问权限 - 打破私有访问权限 - setAccessible(true);
package review;import org.junit.Test;import java.io.ObjectInputStream;import java.lang.reflect.Field;/*** 反射用于处理属性** 利用Student进行操作*/public class FieldTest2 {//反射处理私有字段@Testpublic void test2() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {//1.获取反射类 - Class对象Class cla = Class.forName("review.Student");//2.创建该类的实例Object s1 = cla.newInstance();System.out.println(s1);//Student{id=0, name='null'}//3.处理私有字段 - java.lang.reflect.FieldField f_name = cla.getDeclaredField("name");System.out.println(f_name);//private java.lang.String review.Student.name//4.打破私有访问权限f_name.setAccessible(true);//5.赋值f_name.set(s1,"段誉");System.out.println(s1);//Student{id=0, name='段誉'}//6.获取值Object s1_name = f_name.get(s1);System.out.println(s1_name);//段誉}}
映射Properties
package Properties;import org.junit.Test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;/*** 讲解Properties使用** Properties类是java中提供的(支持度很高的)专门用于处理属性配置文件的一个api* 通常用于属性文件的配置以持久化属性的作用。** 该类来自于java.util包下的,是Map接口的子类,间接继承了Map - 键值对(双列)** 特点:* 1.Map接口的子类,map中的方法都可以使用* 2.该集合没有泛型,键值都是字符串* 3.是一个可以持久化的属性集,键值存储到集合中,也可以持久化到设备(硬盘,u盘等等)上。* 4.有和流结合的技术**/public class PropertiesDemo {//使用步骤:@Testpublic void test1() throws IOException {//1.保存properties的数据到流中 - void store(OutputStream out,String comment)Properties prop = new Properties();prop.put("id","100");prop.put("name","john");prop.store(new FileOutputStream("a.txt"),"冲冲冲,杀了麻生");//内容转换成了Unicode码}//从流中读取 - void load(InputStream in)@Testpublic void test2() throws IOException {Properties prop = new Properties();prop.load(new FileInputStream("a.txt"));System.out.println(prop);//{name=john, id=100}//建议将数据强制转成字符串String v_id = prop.getProperty("id");System.out.println(v_id);//100String v_name = prop.getProperty("name");System.out.println(v_name);//john}@Testpublic void test3() throws IOException {//设置数据 - setProperty(String key,String Value)Properties prop = new Properties();prop.setProperty("id","20");//持久化数据prop.store(new FileOutputStream("a.txt"),"要写入的内容");}@Testpublic void test4() throws IOException {//获取数据 - String getProperties(String key)Properties prop = new Properties();//先通过流读取文件prop.load(new FileInputStream("a.txt"));System.out.println(prop);//{id=20}String v_id = prop.getProperty("id");String v_name = prop.getProperty("name");System.out.println(v_id);//20System.out.println(v_name);//null//如果key找不到则返回null}}
