• JavaSE高级


    目录

    一、单元测试

     1、Junit单元测试框架

     2、单元测试步骤​编辑

    3、Junit常用注解

    二、反射

     1、反射获取Class对象

     2、反射获取构造器

     3、反射获取成员变量

     4、反射获取成员方法

     5、反射的作用1 --绕过编译阶段为集合添加数据

     6、反射的作用2 --通用框架的底层原理

    三、注解

    1、注解概述

    2、自定义注解

    3、元注解

    4、注解解析

    四、动态代理

    1、动态代理概述

    2、动态代理模拟开发

    五、XML

    1、XML概述

    2、XML的创建、语法规则

    3、XML文档约束

    4、XML解析


    一、单元测试

     1、Junit单元测试框架

     2、单元测试步骤

    1. public class JunitDemo1 {
    2. public String login(String userName,String password){
    3. if ("admin".equals(userName) && "12345".equals(password)){
    4. return "登陆成功";
    5. }else {
    6. return "您的账户或密码有问题";
    7. }
    8. }
    9. public void selectName(){
    10. System.out.println((10 / 0));
    11. }
    12. }
    13. //测试类
    14. public class TestJunitDEmo1 {
    15. @Test
    16. public void testLogin(){
    17. JunitDemo1 j = new JunitDemo1();
    18. String rs = j.login("admin","12345");
    19. //进行预期结果的正确性测试,断言
    20. //参数一:错误备注
    21. //参数二:预期输出结果
    22. //参数三:实际输出结果
    23. Assert.assertEquals("这里是错误备注","登陆成功",rs);
    24. }
    25. @Test
    26. public void testName(){
    27. JunitDemo1 j = new JunitDemo1();
    28. //没有返回值可以直接调用
    29. j.selectName();
    30. }
    31. }

    3、Junit常用注解

    二、反射

     1、反射获取Class对象

    1. public class Test {
    2. //反射第一步:获取Class对象
    3. public static void main(String[] args) throws ClassNotFoundException {
    4. //1、Class类中的一个静态方法:forName(全限名:包名 + 类名)
    5. Class c = Class.forName("com.itheima.reflect.Student");
    6. System.out.println(c);
    7. //2、类名.class
    8. Class c1 = Student.class;
    9. System.out.println(c1);
    10. //3、对象.getClass() 获取对象对应类的Class对象
    11. Student s = new Student();
    12. Class c2 = s.getClass();
    13. System.out.println(c2);
    14. }
    15. }

    2、反射获取构造器

     

    1. public class TestStudent {
    2. //1、getConstructors
    3. //获取全部的构造器并返回一个构造器集合:只能获取public修饰的构造器
    4. //Constructor[] getConstructors()
    5. @Test
    6. public void getConstructors() {
    7. //第一步获取类对象
    8. Class c = Student.class;
    9. //提取类中全部的构造器对象
    10. Constructor[] constructors = c.getConstructors();
    11. //遍历构造器
    12. for (Constructor constructor : constructors) {
    13. System.out.println(constructor.getName() + "====>" + constructor.getParameterCount());
    14. }
    15. }
    16. //2、getDeclaredConstructor
    17. //获取全部构造器并返回一个集合,包括privat修饰的所有权限构造器
    18. @Test
    19. public void getDeclaredConstructors() {
    20. //第一步获取类对象
    21. Class c = Student.class;
    22. //提取类中全部的构造器对象
    23. Constructor[] constructors = c.getDeclaredConstructors();
    24. //遍历构造器
    25. for (Constructor constructor : constructors) {
    26. System.out.println(constructor.getName() + "====>" + constructor.getParameterCount());
    27. }
    28. }
    29. //3、getConstructor 获取单个构造器,只能是public修饰
    30. @Test
    31. public void getConstructor() {
    32. //第一步获取类对象
    33. Class c = Student.class;
    34. try {
    35. //提取类中的一个构造器对象(按照参数定位无参构造器)
    36. Constructor con = c.getConstructor();
    37. System.out.println(con.getName() + "====>" + con.getParameterCount());
    38. } catch (Exception e) {
    39. e.printStackTrace();
    40. }
    41. }
    42. //4、getDeclaredConstructor 获取单个构造器 所有权限
    43. @Test
    44. public void getDeclaredConstructor() throws NoSuchMethodException {
    45. //第一步获取类对象
    46. Class c = Student.class;
    47. //提取类中的一个构造器对象(按照参数定位无参构造器)
    48. Constructor con = c.getDeclaredConstructor();
    49. System.out.println(con.getName() + "====>" + con.getParameterCount());
    50. //获取有参构造器
    51. //构造器为 字符串类和int类
    52. Constructor con1 = c.getDeclaredConstructor(String.class, int.class);
    53. System.out.println(con.getName() + "====>" + con1.getParameterCount());
    54. }
    55. }

    1. public class TestStudent2 {
    2. //1、调用构造器得到一个类的对象返回
    3. @Test
    4. public void getDeclaredConstructor() throws Exception {
    5. //第一步获取类对象
    6. Class c = Student.class;
    7. //提取类中的一个构造器对象(按照参数定位无参构造器)
    8. Constructor con = c.getDeclaredConstructor();
    9. System.out.println(con.getName() + "====>" + con.getParameterCount());
    10. //如果构造器是私有的,可以暴力反射
    11. //将私有权限打开
    12. con.setAccessible(true);
    13. //2、根据构造器创建对象
    14. Student student = (Student) con.newInstance();
    15. System.out.println(student);
    16. }
    17. }

    构造器来new自己

     3、反射获取成员变量

    1. public class TestFields {
    2. //1、获取全部成员变量 getDeclaredFields
    3. @Test
    4. public void getDeclaredFields(){
    5. //1、获取Class类
    6. Class c = Student.class;
    7. //获取全部成员变量
    8. Field[] fields = c.getDeclaredFields();
    9. for (Field field : fields) {
    10. System.out.println(field.getName() + "===>" + field.getType());
    11. }
    12. }
    13. //2、获取某个成员变量 getDeclaredField
    14. @Test
    15. public void getDeclaredField() throws Exception {
    16. //2、获取Class类
    17. Class c = Student.class;
    18. //获取单个成员变量 根据成员名称获取
    19. Field age = c.getDeclaredField("age");
    20. //成员变量私有,反射暴力破解
    21. age.setAccessible(true);
    22. //对获取到的成员变量进行赋值
    23. Student s = new Student();
    24. //年龄追着对象跑,年龄让对象将自己的值改为18 --反射
    25. //正常是对象对自己说将年龄改成18
    26. age.set(s,18);
    27. System.out.println(s);
    28. //对成员变量取值
    29. int a = (int)age.get(s);
    30. System.out.println(a);
    31. }
    32. }

      4、反射获取成员方法

     

    1. public class Dog {
    2. private String name;
    3. .
    4. .
    5. .
    6. public void run(){
    7. System.out.println("狗跑得快");
    8. }
    9. public void eat(){
    10. System.out.println("吃东西");
    11. }
    12. private String eat(String name){
    13. System.out.println("狗吃" + name);
    14. return "吃得很开心";
    15. }
    16. }
    17. public class TestMethods {
    18. //1、获取所有成员方法 getDeclaredMethods
    19. @Test
    20. public void getDeclaredMethods(){
    21. //1、获取Class类
    22. Class c = Dog.class;
    23. //2、提取全部方法包括私有的
    24. Method[] methods = c.getDeclaredMethods();
    25. //3、遍历全部方法
    26. for (Method method : methods) {
    27. System.out.println(method.getName() + "返回值类型:" + method.getReturnType() + "参数个数:" + method.getParameterCount());
    28. }
    29. }
    30. //2、获取单个成员方法 getDeclaredMethod
    31. @Test
    32. public void getDeclaredMethod() throws Exception {
    33. //1、获取Class类
    34. Class c = Dog.class;
    35. //2、提取单个方法
    36. Method method = c.getDeclaredMethod("eat");
    37. //参数一:方法名 参数二:参数类型
    38. Method method2 = c.getDeclaredMethod("eat",String.class);
    39. //3、私有方法暴力反射
    40. method.setAccessible(true);
    41. method2.setAccessible(true);
    42. //4、创建对象触发方法执行
    43. Dog d = new Dog();
    44. //如果方法没有返回值会返回null
    45. Object result = method.invoke(d);
    46. //有参数的方法
    47. Object result2 = method2.invoke(d,"骨头");
    48. System.out.println(result);
    49. System.out.println(result2);
    50. }
    51. }

     5、反射的作用1 --绕过编译阶段为集合添加数据

    作用:可以绕过编译阶段向集合中添加元素,集合的泛型相当于厕所门口的标志,编译器相当于守厕所的大爷,男生如果要进入女厕所就会被大爷(编译器)拦下报错,但是通过反射可以绕过大爷,翻墙进入。使字符串类型加入到了整型列表中。

    1. public class ReflectFunction {
    2. public static void main(String[] args) throws Exception {
    3. //这两个集合的底层都是Arraylist集合不会再区分泛型类型,对泛型进行擦除
    4. ArrayList arrayList1 = new ArrayList<>();
    5. ArrayList arrayList2 = new ArrayList<>();
    6. arrayList2.add(23);
    7. arrayList2.add(34);
    8. // 直接编译时报错 arrayList2.add("ewe");
    9. //泛型相当于厕所的男女标志,编译器相当于守厕所的人
    10. //加入你不是整型却要往整型列表中进,编译器就会编译时报错
    11. //反射的作用就能够绕过这个编译器进入这个集合中
    12. //获取类对象
    13. Class c = arrayList2.getClass();
    14. //获取集合添加元素的方法 add(E e) 参数是任意类型 ->Object
    15. Method add = c.getDeclaredMethod("add",Object.class);
    16. //使用获取的方法向整型集合中添加字符串
    17. Boolean aBoolean = (Boolean) add.invoke(arrayList2, "edd");
    18. System.out.println(arrayList2);
    19. //arrayList-> [23,34,edd]
    20. }
    21. }

     6、反射的作用2 --通用框架的底层原理

    1. public class MyBatisUtil {
    2. //保存任意类型的对象
    3. public static void save(Object object) {
    4. try (
    5. PrintStream ps = new PrintStream(new FileOutputStream("javasehigh/src/datd.txt", true));
    6. ) {
    7. //1、获取对象的Class对象
    8. Class c = object.getClass();
    9. //getSimpleName获取类名 getName获取全域名(包名+类名)
    10. ps.println("============" + c.getSimpleName() + "==============");
    11. //2、获取全部成员变量
    12. Field[] f = c.getDeclaredFields();
    13. //3、获取成员变量的信息
    14. for (Field field : f) {
    15. //获取成员变量的名称
    16. String name = field.getName();
    17. //暴力反射解开私有构造器
    18. field.setAccessible(true);
    19. //获取成员变量的值,转化成字符串
    20. //成员变量追着对象调用它的值 object.getField
    21. // 例如学生对象的年龄,年龄告诉学生对象,把你的年龄输出。student.getName
    22. String value = field.get(object) + "";
    23. ps.println(name + "=" + value);
    24. }
    25. } catch (Exception e) {
    26. e.printStackTrace();
    27. }
    28. }
    29. }
    30. public class ReflectDemo {
    31. public static void main(String[] args) {
    32. Student student = new Student("张三",'男',"红星小学",13);
    33. MyBatisUtil.save(student);
    34. Teacher teacher = new Teacher("李四",34);
    35. MyBatisUtil.save(teacher);
    36. }
    37. }

    三、注解

    1、注解概述

    对Java中类、方法、成员变量做标记,然后进行特殊处理。

    注解就相当于便签,可以在便签上随便声明,然后贴在任何地方

    2、自定义注解

     

    1. public @interface MyBook {
    2. String name();
    3. String[] authors();
    4. double price();
    5. }
    6. public @interface Book {
    7. //1、只有一个特殊属性,调用注解可以不写变量值
    8. String value();
    9. //2、如果其他值设置了默认值使用注解时也可以不写
    10. double price() default 9.9;
    11. }
    12. @MyBook(name = "《测似乎》",authors = {"黑啊吗","csdc"},price = 13)
    13. public class AnnotationDemo {
    14. //注解中只有一个value特殊属性值可以不写值
    15. @Book("/asc")
    16. public static void main(String[] args) {
    17. }
    18. }

    3、元注解

    约束注解的一种注解

    1. //元注解:约束注解的对象,允许注解方法、成员变量和类
    2. @Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
    3. //约束自定义注解的存活时间
    4. @Retention(RetentionPolicy.RUNTIME)
    5. public @interface MyBook {
    6. String name();
    7. String[] authors();
    8. double price();
    9. }

    4、注解解析

    1. //Book注解
    2. @Target({ElementType.METHOD,ElementType.TYPE})
    3. @Retention(RetentionPolicy.RUNTIME)
    4. public @interface Book {
    5. String value();
    6. double price() default 100;
    7. String[] author();
    8. }
    9. @Book(value = "《三少爷的剑》",price = 99.9,author = {"古龙","测试"})
    10. public class BookStore {
    11. @Book(value = "《倚天屠龙记》",price = 399.9,author = {"金庸","测试"})
    12. public static void test(){
    13. }
    14. public class BookStoreDemo {
    15. //解析BookStore的注解
    16. @Test
    17. public void parseBook() throws Exception {
    18. //1、获取Class对象
    19. Class c = BookStore.class;
    20. //2、获取成员方法
    21. Method method = c.getDeclaredMethod("test");
    22. //判断这个方法上是否有这个注解类型 ,用方法去调用
    23. //method.isAnnotationPresent(Book.class)
    24. //method.getDeclaredAnnotation(Book.class)
    25. //3、判断这个类上是否有这个注解类型
    26. if (c.isAnnotationPresent(Book.class)){
    27. //4、获取注解内容,对类型强转
    28. Book book = (Book)c.getDeclaredAnnotation(Book.class);
    29. System.out.println(book.value());
    30. System.out.println(book.price());
    31. System.out.println(Arrays.toString(book.author()));
    32. }
    33. }
    34. }

    四、动态代理

    1、动态代理概述

    一定要使用接口约束行为才能动态代理。

    1. //明星类
    2. public class Star implements Skill{
    3. //创建一个明星类实现约束接口
    4. private String name;
    5. .
    6. .
    7. .
    8. @Override
    9. public void dance() {
    10. System.out.println(name + "开始跳舞");
    11. }
    12. @Override
    13. public void sing() {
    14. System.out.println(name + "开始唱歌");
    15. }
    16. }
    17. public interface Skill {
    18. //定义一个接口约束明星的行为
    19. void dance();
    20. void sing();
    21. }
    22. //创建经纪人
    23. public class StarAgentProxy {
    24. /**
    25. 将创建经纪人封装成一个方法
    26. 设计一个方法返回一个明星对象的代理对象
    27. */
    28. //返回值为Skill,因为经纪人是约束明星的行为所以他同样要实现Skill接口
    29. //所以返回Skill父类创建代理对象,属于多态
    30. public static Skill getProxy(Star s){
    31. //为明星对象生成代理对象
    32. /**
    33. public static Object newProxyInstance(
    34. ClassLoader loader,创建一个类加载器
    35. 这个方法底层会产生一个代理类,通过代理类产生代理对象,它自己生成代理类需要类加载器加载到内存
    36. Class[] interfaces, 对象实现的接口列表
    37. 将明星对象的接口交给该方法,因为代理是为明星对象行为做代理,而明星对象的行为封装在接口里,让该方法直到要为哪些行为做代理
    38. InvocationHandler h 代理的核心处理逻辑对象
    39. */
    40. return (Skill) Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(),
    41. new InvocationHandler() {
    42. @Override
    43. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    44. System.out.println("收首款");
    45. //真正的让杨超越唱歌和跳舞
    46. // method 正在调用的方法对象 args 代表这个方法的参数
    47. //有返回值就接没有就返回null
    48. Object rs = method.invoke(s, args);
    49. System.out.println("收尾款,接回" + s.getName());
    50. return null;
    51. }
    52. });
    53. }
    54. }
    55. //测试类
    56. public class Test {
    57. public static void main(String[] args) {
    58. //创建动态代理对象
    59. //1、创建一个明星对象
    60. Star s = new Star("张三");
    61. //2、如果要找明星就得先找他的经纪人
    62. //为明星对象创建一个经纪人
    63. Skill s2 = StarAgentProxy.getProxy(s);
    64. //让他跳舞
    65. //s2.dance();
    66. //让他唱歌
    67. s2.sing();
    68. }
    69. }

     

    2、动态代理模拟开发

    1. //测试类
    2. public class Test {
    3. public static void main(String[] args) {
    4. UserServer user = new UserServerImplement();
    5. //创建一个用户的代理对象
    6. UserServer userServer = UserProxy.createProxy(user);
    7. userServer.delete();
    8. }
    9. }
    10. //接口约束
    11. public interface UserServer {
    12. void logim(String username,String password);
    13. void delete();
    14. void quary();
    15. }
    16. //用户对象
    17. public class UserServerImplement implements UserServer{
    18. @Override
    19. public void logim(String username,String password) {
    20. if ("admin".equals(username) && "12345".equals(password)){
    21. try {
    22. Thread.sleep(1200);
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. System.out.println("登陆成功");
    27. }else {
    28. try {
    29. Thread.sleep(1200);
    30. } catch (InterruptedException e) {
    31. e.printStackTrace();
    32. }
    33. System.out.println("用户名或密码错误");
    34. }
    35. }
    36. @Override
    37. public void delete() {
    38. System.out.println("正在删除账户");
    39. try {
    40. Thread.sleep(2000);
    41. } catch (InterruptedException e) {
    42. e.printStackTrace();
    43. }
    44. System.out.println("删除成功!");
    45. }
    46. @Override
    47. public void quary() {
    48. System.out.println("正在查询。。");
    49. try {
    50. Thread.sleep(1600);
    51. } catch (InterruptedException e) {
    52. e.printStackTrace();
    53. }
    54. System.out.println("查询成功");
    55. }
    56. }
    57. //用户代理对象
    58. public class UserProxy {
    59. //创建代理对象并返回,封装方法
    60. public static UserServer createProxy(UserServer user){
    61. return (UserServer) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(),
    62. new InvocationHandler() {
    63. @Override
    64. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    65. long startTime = System.currentTimeMillis();
    66. //方法执行
    67. Object rs = method.invoke(user,args);
    68. long overTime = System.currentTimeMillis();
    69. System.out.println(method.getName() + "方法耗时:" + (overTime - startTime) / 1000.0 + "s");
    70. return rs;
    71. }
    72. });
    73. }
    74. }

    五、XML

    1、XML概述

     

     

    2、XML的创建、语法规则

    1. <student>
    2. <name>张三name>
    3. <sex>sex>
    4. <sql>
    5. select * from user where age < 18;
    6. 直接写在数据区内就可以避免冲突
    7. select * from user where age < 18;
    8. ]]>
    9. sql>
    10. student>

    3、XML文档约束

    1. dtd约束文件
    2. #PCDATA)>
    3. #PCDATA)>
    4. #PCDATA)>
    5. SYSTEM "data.dtd">
    6. <书架>
    7. <书>
    8. <书名>
    9. <作者>
    10. <售价>

     

     

     

    4、XML解析

     

  • 相关阅读:
    黑胶歌曲没权限,还好我会Python,一分钟一个歌单,硬盘有点不够用了~
    强化学习学习笔记
    语音数据集2-VCTK多人音频
    电脑重装系统后DirectX12旗舰版禁用了怎么解决?
    OpenCV安装、QT、VS配置项目设置
    SQL按年月创建动态表
    chrome盗取用户身份
    新手学习c语言_第二部分
    【论文&模型讲解】多模态对话 Multimodal Dialogue Response Generation
    浅谈网络损伤仪HoloWAN的使用场景
  • 原文地址:https://blog.csdn.net/m0_56044262/article/details/125947242