了解反射

java反射机制:内存中获取java中的属性和方法的操作。
首先反射的一个类用于操作反射:Class - java.lang包下

获取类:我们操作中的new关键字其实在java的内存中作了几件事:**

  1. 先找到构造函数(有参、无参)
  2. 反射中私有属性不一定要提供set/get方法,因为在反射中我们不需要调用方法,直接在构造函数中处理就可以。
  3. 反射中能够调用方法,利用method对象进行方法的处理
  4. 反射中获取类的方式有三种,但是这些获取到的类一定是同一个:==比较时true,地址的指向一致
  5. 反转中可以获取私有的和公有的字段

**

反射处理公共字段

  1. package review;
  2. import org.junit.Test;
  3. import java.lang.reflect.Field;
  4. /**
  5. * 反射用于处理属性
  6. *
  7. * 利用Student进行操作
  8. */
  9. public class FieldTest1 {
  10. @Test
  11. //这个方法的返回值只能是void,并且不能传参
  12. public void test1(){
  13. //常规的给类中public字段赋值
  14. Student s = new Student();
  15. s.setId(11);
  16. System.out.println(s);
  17. }
  18. //反射处理公共字段
  19. @Test
  20. public void test2() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
  21. //1.获取反射类 - Class对象
  22. Class cla = Class.forName("review.Student");
  23. //2.创建该类的实例
  24. Object s1 = cla.newInstance();
  25. System.out.println(s1);//Student{id=0, name='null'}
  26. //3.处理字段 - java.lang.reflect.Field
  27. Field f_id = cla.getField("id");
  28. System.out.println(f_id);//public int review.Student.id
  29. //4.赋值 - 第一个参数是当前所在的类,第二个参数是值
  30. f_id.set(s1,30);
  31. System.out.println(s1);//Student{id=30, name='null'}
  32. //5.获取字段的值
  33. Object id_value = f_id.get(s1);
  34. System.out.println(id_value);//30
  35. }
  36. }

反射处理私有字段

使用的方法getDeclaredField(); (带有Declared的方法)
赋值操作要先破解访问权限 - 打破私有访问权限 - setAccessible(true);

  1. package review;
  2. import org.junit.Test;
  3. import java.io.ObjectInputStream;
  4. import java.lang.reflect.Field;
  5. /**
  6. * 反射用于处理属性
  7. *
  8. * 利用Student进行操作
  9. */
  10. public class FieldTest2 {
  11. //反射处理私有字段
  12. @Test
  13. public void test2() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
  14. //1.获取反射类 - Class对象
  15. Class cla = Class.forName("review.Student");
  16. //2.创建该类的实例
  17. Object s1 = cla.newInstance();
  18. System.out.println(s1);//Student{id=0, name='null'}
  19. //3.处理私有字段 - java.lang.reflect.Field
  20. Field f_name = cla.getDeclaredField("name");
  21. System.out.println(f_name);//private java.lang.String review.Student.name
  22. //4.打破私有访问权限
  23. f_name.setAccessible(true);
  24. //5.赋值
  25. f_name.set(s1,"段誉");
  26. System.out.println(s1);//Student{id=0, name='段誉'}
  27. //6.获取值
  28. Object s1_name = f_name.get(s1);
  29. System.out.println(s1_name);//段誉
  30. }
  31. }

映射Properties

  1. package Properties;
  2. import org.junit.Test;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.util.Properties;
  8. /**
  9. * 讲解Properties使用
  10. *
  11. * Properties类是java中提供的(支持度很高的)专门用于处理属性配置文件的一个api
  12. * 通常用于属性文件的配置以持久化属性的作用。
  13. *
  14. * 该类来自于java.util包下的,是Map接口的子类,间接继承了Map - 键值对(双列)
  15. *
  16. * 特点:
  17. * 1.Map接口的子类,map中的方法都可以使用
  18. * 2.该集合没有泛型,键值都是字符串
  19. * 3.是一个可以持久化的属性集,键值存储到集合中,也可以持久化到设备(硬盘,u盘等等)上。
  20. * 4.有和流结合的技术
  21. *
  22. */
  23. public class PropertiesDemo {
  24. //使用步骤:
  25. @Test
  26. public void test1() throws IOException {
  27. //1.保存properties的数据到流中 - void store(OutputStream out,String comment)
  28. Properties prop = new Properties();
  29. prop.put("id","100");
  30. prop.put("name","john");
  31. prop.store(new FileOutputStream("a.txt"),"冲冲冲,杀了麻生");//内容转换成了Unicode码
  32. }
  33. //从流中读取 - void load(InputStream in)
  34. @Test
  35. public void test2() throws IOException {
  36. Properties prop = new Properties();
  37. prop.load(new FileInputStream("a.txt"));
  38. System.out.println(prop);//{name=john, id=100}
  39. //建议将数据强制转成字符串
  40. String v_id = prop.getProperty("id");
  41. System.out.println(v_id);//100
  42. String v_name = prop.getProperty("name");
  43. System.out.println(v_name);//john
  44. }
  45. @Test
  46. public void test3() throws IOException {
  47. //设置数据 - setProperty(String key,String Value)
  48. Properties prop = new Properties();
  49. prop.setProperty("id","20");
  50. //持久化数据
  51. prop.store(new FileOutputStream("a.txt"),"要写入的内容");
  52. }
  53. @Test
  54. public void test4() throws IOException {
  55. //获取数据 - String getProperties(String key)
  56. Properties prop = new Properties();
  57. //先通过流读取文件
  58. prop.load(new FileInputStream("a.txt"));
  59. System.out.println(prop);//{id=20}
  60. String v_id = prop.getProperty("id");
  61. String v_name = prop.getProperty("name");
  62. System.out.println(v_id);//20
  63. System.out.println(v_name);//null
  64. //如果key找不到则返回null
  65. }
  66. }