什么是反射?

是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展

获取类对象:

类名.Class属性 ===》 person.Class; ===> Class aClass = Person.class;
对象名.getClass方法 ===》 person.getClass(); ===> Class aClass = person.getClass();
Class.forName(全类名)方法 ===》 Class aClass = Class.forName(“com.smiledog.fanshe.Person”); 主要使用

获取类对象的成员变量,构造函数,方法:

  1. package com.smiledog.fanshe;
  2. /*
  3. @ClassName GetFanSheDemo
  4. @Author SmILeDog
  5. @Date 2021/5/12
  6. @Time 12:52
  7. 通过获得类对象获取的对象的数据
  8. */
  9. import java.lang.reflect.Constructor;
  10. import java.lang.reflect.Field;
  11. import java.lang.reflect.InvocationTargetException;
  12. import java.lang.reflect.Method;
  13. public class GetFanSheDemo {
  14. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchFieldException {
  15. //获取类实例
  16. Class classzz = Class.forName("com.smiledog.fanshe.Person");
  17. //获取类全路径
  18. String name = classzz.getName();
  19. //System.out.println(name);
  20. //获取公开构造
  21. Constructor[] cons1 = classzz.getConstructors();
  22. for (Constructor con : cons1) {
  23. System.out.println(con);
  24. }
  25. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  26. //获取所有构造
  27. Constructor[] cons2 = classzz.getDeclaredConstructors();
  28. for (Constructor con : cons2) {
  29. System.out.println(con);
  30. }
  31. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  32. //获取指定参数构造
  33. Constructor con1 = classzz.getConstructor(String.class);
  34. System.out.println(con1);
  35. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  36. //获取公有方法
  37. Method[] methods = classzz.getMethods();
  38. for (Method method : methods) {
  39. System.out.println(method);
  40. }
  41. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  42. //获取所有方法
  43. Method[] declaredMethods = classzz.getDeclaredMethods();
  44. for (Method declaredMethod : declaredMethods) {
  45. System.out.println(declaredMethod);
  46. }
  47. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  48. //获取指定方法名的方法
  49. Method eat = classzz.getDeclaredMethod("eat");
  50. System.out.println(eat);
  51. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  52. //获取公有成员变量
  53. Field[] fields = classzz.getFields();
  54. for (Field field : fields) {
  55. System.out.println(field);
  56. }
  57. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  58. //获取所有成员变量
  59. Field[] declaredFields = classzz.getDeclaredFields();
  60. for (Field declaredField : declaredFields) {
  61. System.out.println(declaredField);
  62. }
  63. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  64. //获取指定成员变量
  65. Field name1 = classzz.getDeclaredField("name");
  66. System.out.println(name1);
  67. }
  68. }

操作获取的类对象数据:

  1. package com.smiledog.fanshe;
  2. /*
  3. @ClassName UseFanSheDemo
  4. @Author SmILeDog
  5. @Date 2021/5/12
  6. @Time 14:55
  7. 通过获得类对象操作获取的对象的数据
  8. */
  9. import java.lang.reflect.Constructor;
  10. import java.lang.reflect.Field;
  11. import java.lang.reflect.InvocationTargetException;
  12. import java.lang.reflect.Method;
  13. public class UseFanSheDemo {
  14. public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
  15. Class<?> classzz = Class.forName("com.smiledog.fanshe.Person"); //获取类对象
  16. //使用构造方法
  17. //Constructor<?> con1 = classzz.getDeclaredConstructor(String.class); //获取构造方法
  18. //Object obj1 = con1.newInstance("10010"); //实例化对象
  19. //System.out.println(obj1); //打印对象
  20. //使用私有构造方法 不建议使用,既然是私有,强制反射的话出现安全问题
  21. //Constructor<?> con2 = classzz.getDeclaredConstructor(int.class); //获取私有构造方法
  22. //con2.setAccessible(true); //强制反射,,不加找不到私有构造,//不建议。。。。
  23. //Object obj2 = con2.newInstance(100);
  24. //System.out.println(obj2);
  25. // //使用方法
  26. // Object o = classzz.newInstance(); //实例化
  27. // Method eatmethod = classzz.getMethod("eat"); //获取指定方法
  28. // eatmethod.invoke(o); //调用指定对象的方法
  29. // //使用私有方法
  30. // Method showmethod = classzz.getDeclaredMethod("show"); //获取指定方法
  31. // showmethod.setAccessible(true); //暴力反射
  32. // showmethod.invoke(o); //调用指定对象的方法
  33. //使用成员变量
  34. // Object o = classzz.newInstance(); //实例化
  35. // Field id = classzz.getField("id"); //获取指定成员变量
  36. // id.set(o,"id:001"); //给指定对象赋值
  37. // Object o1 = id.get(o); //获取指定对象的成员变量
  38. // System.out.println(o1); //打印该对象
  39. //使用私有成员变量
  40. Object o = classzz.newInstance(); //实例化
  41. Field name = classzz.getDeclaredField("name");//获取指定的私有成员变量
  42. name.setAccessible(true); //强制反射该对象
  43. name.set(o,"姓名:杀杀杀"); //给指定对象赋值
  44. Object o1 = name.get(o); //获取指定对象的私有成员变量
  45. System.out.println(o1); //打印该对象
  46. }
  47. }

反射&Properties案例:

  1. package com.smiledog.fanshe.fanshedemo;
  2. /*
  3. @ClassName Person
  4. @Author SmILeDog
  5. @Date 2021/5/12
  6. @Time 12:52
  7. */
  8. public class Person {
  9. public String id;
  10. public String name;
  11. public int age;
  12. public void eat(){
  13. System.out.println("干饭 .....");
  14. }
  15. public void sleep(){
  16. System.out.println("碎觉 ......");
  17. }
  18. private void play(){
  19. System.out.println("打豆豆 ......");
  20. }
  21. }
  22. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23. package com.smiledog.fanshe.fanshedemo;
  24. /*
  25. @ClassName FanSheDemo
  26. @Author SmILeDog
  27. @Date 2021/5/12
  28. @Time 15:54
  29. 使用properties配置文件,进行反射的相关操作
  30. */
  31. import java.io.*;
  32. import java.lang.reflect.InvocationTargetException;
  33. import java.lang.reflect.Method;
  34. import java.util.Properties;
  35. public class FanSheDemo {
  36. public static void main(String[] args) throws ClassNotFoundException, IOException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
  37. FileReader fw = new FileReader(new File("person.properties"));
  38. //day16/person.properties
  39. //读取配置文件
  40. Properties pro = new Properties();
  41. pro.load(fw);
  42. String className = pro.getProperty("className");
  43. String methodName = pro.getProperty("methodName");
  44. //反射
  45. Class<?> aClass = Class.forName(className);
  46. Object obj = aClass.newInstance();
  47. Method method = aClass.getDeclaredMethod(methodName); //为避免获取私有方法,直接调用获取所有方法的方法
  48. method.setAccessible(true); //且强制反射
  49. method.invoke(obj);
  50. }
  51. }
  52. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~person.properties~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  53. className=com.smiledog.fanshe.fanshedemo.Person
  54. methodName=play

XML:

可扩展的标记语言

xml与html的区别:

html:用来展示数据的
xml:用来储存数据,持久化,配置文件【在网络中传输数据,后被json取代】

xml的基础语法:

1、xml文档的后缀名必须是:. xml
2、xml文档的第一行必须定义为:文档声明
3、xml文档有且仅有一个根标签
4、属性值必须使用引号(单引号或双引号)引起来
5、标签必须正确关闭,也就是双标签的规范
6、xml文档严格区分大小写

xml的快速入门:

使用xml描述学生信息:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!--This XML file does not appear to have any style information associated with it. The document tree is shown below.-->
  3. <!--此XML文件似乎没有任何与之关联的样式信息。文档树如下所示。-->
  4. <Students>
  5. <student id="it001">
  6. <name>张三</name>
  7. <age>13</age>
  8. <sex></sex>
  9. </student>
  10. <student id="it002">
  11. <name>李四</name>
  12. <age>14</age>
  13. <sex></sex>
  14. </student>
  15. </Students>

xml的组成部分:

1、文档声明:
格式:
<?xml 属性列表 ?>
属性列表:
version:版本号:【1.0】
encoding:编码方式【默认值:ISO-8859-1】
standalone:是否独立【yes:不依赖其他文件 no:依赖其他文件】
2、指令:(不重要)
3、标签命名规则: (总之一句话:简洁明了)
名称可以包含字母,数字以及其他的字符
名称不能以数字或标点符号开始
名称不能以字母xml开始
名称不能包含空格
不要用 双引号,逗号,冒号,
xml命名经验之谈,文档经常有一个对应的数据库,最好根据数据库的命名规则来命名
4、属性:使用单引号和双引号
属性值唯一(官方说法)
5、文本:就是双标签里边的数据
转义字符:
&lt;:< 小于
&gt;:> 大于
&amp;:& 和
&apos;:’ ‘ 单引号
&quot;:” “ 双引号
转成文本数据 :<![CDATA[ 文本内容 ]]>

xml的约束:

规定xml的书写规则
DTD约束:
新建一个文件,文件的扩展名是(.dtd)

  1. <!ELEMENT students (student*) > //根标签下有一个或多个子标签
  2. <!ELEMENT student (name,age,sex)> //子标签里边的子标签,且有顺序
  3. <!ELEMENT name (#PCDATA)> //该标签中写文本
  4. <!ELEMENT age (#PCDATA)>
  5. <!ELEMENT sex (#PCDATA)>
  6. <!ATTLIST student number ID #REQUIRED> //子标签的属性唯一
  7. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  8. <?xml version="1.0" encoding="UTF-8" ?>
  9. <!DOCTYPE students SYSTEM "student.dtd">
  10. <students>
  11. <student number="001">
  12. <name>张三</name>
  13. <age>13</age>
  14. <sex></sex>
  15. </student>
  16. </students>

Schema约束:
新建一个文件,文件的扩展名是:(.xsd)

  1. <?xml version="1.0"?>
  2. <xsd:schema xmlns="(命名空间:公司域名)/xml"
  3. xmlns:xsd="http://www.w3.org/2001/XMLSchema" //固定写法
  4. targetNamespace="(命名空间:公司域名)/xml" elementFormDefault="qualified">
  5. <xsd:element name="students" type="studentsType"/>
  6. <xsd:complexType name="studentsType">
  7. <xsd:sequence>
  8. <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
  9. </xsd:sequence>
  10. </xsd:complexType>
  11. <xsd:complexType name="studentType">
  12. <xsd:sequence>
  13. <xsd:element name="name" type="xsd:string"/> //指定类型
  14. <xsd:element name="age" type="ageType" /> //自定义类型
  15. <xsd:element name="sex" type="sexType" />
  16. </xsd:sequence>
  17. <xsd:attribute name="number" type="numberType" use="required"/>
  18. </xsd:complexType>
  19. <xsd:simpleType name="sexType"> //自定义类型的格式
  20. <xsd:restriction base="xsd:string"> //自定义类型内容的类型
  21. <xsd:enumeration value="male"/> //指定内容范围 :单选
  22. <xsd:enumeration value="female"/>
  23. </xsd:restriction>
  24. </xsd:simpleType>
  25. <xsd:simpleType name="ageType"> //自定义类型的格式
  26. <xsd:restriction base="xsd:integer"> //自定义类型内容的类型
  27. <xsd:minInclusive value="0"/> //指定内容范围 :数值范围
  28. <xsd:maxInclusive value="100"/>
  29. </xsd:restriction>
  30. </xsd:simpleType>
  31. <xsd:simpleType name="numberType"> //自定义类型的格式
  32. <xsd:restriction base="xsd:string"> //自定义类型内容的类型
  33. <xsd:pattern value="itfxp_\d{4}"/> //正则表达式 :内容格式:(itfxp_开头 加上 四位数)
  34. </xsd:restriction>
  35. </xsd:simpleType>
  36. </xsd:schema>
  37. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  38. <?xml version="1.0" encoding="UTF-8" ?>
  39. <!--
  40. 1.填写xml文档的根元素
  41. 2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //固定写法
  42. 3.引入xsd文件命名空间. xsi:schemaLocation="(命名空间:公司域名)/xml student.xsd"
  43. 4.为每一个xsd约束声明一个前缀,作为标识 xmlns="(命名空间:公司域名)"
  44. -->
  45. <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  46. xmlns="(命名空间:公司域名)"
  47. xsi:schemaLocation="(命名空间:公司域名)/xml student.xsd"
  48. >
  49. <student number="itfxp_0010">
  50. <name>张三</name>
  51. <age>100</age>
  52. <sex>male</sex>
  53. </student>
  54. </students>
  55. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~