Files
Java-Basic-and-Advanced/最后部分JavaSE加强.md
2026-01-07 16:14:38 +08:00

4.5 KiB
Raw Permalink Blame History

日志

日志框架

image-20260104152029322

image-20260104152046997

枚举

一般用作信息的标记和分类

image-20260104152756174

枚举的特点

image-20260104153710216

作用:

代码优雅,可读性高,入参约束严谨

类加载器

过程

image-20260105160242903

类加载器的分类

image-20260105161129784

双亲委派模型:

反射:

如何创建类的字节码对象:

反射类中的构造方法

其中返回单个构造方法对象括号中给的参数是可变参数,给的是字节码文件参数,用来代表返回的是有参构造还是无参构造,可看下边例子

image-20260105170936519

反射到Constructor类中后的创建对象方法

image-20260105171056746

其中newInstance方法中的参数代表了是走的带参构造还是无参构造

public class Demo1 {
    public static void main(String[] args) throws Exception{
        //获取类的字节码对象
        Class<?> class1 = Class.forName("com.ice.cat.domain.Student");
        //反射构造方法对象
        Constructor<?> constructor = class1.getDeclaredConstructor(String.class,int.class);//此方法无视权限返回单个所有权限的构造方法对象
        //设置为true 表示取消访问检查
        constructor.setAccessible(true);
        //通过此方法实例化,创建对象
        Object o = constructor.newInstance("杏菜",15);
        System.out.println(o);
    }
}

反射类中的成员变量:

image-20260105173059327

设置成员变量的方法

image-20260105173145296

例子:

public class Demo2 {
    public static void main(String[] args)throws Exception{
        //获取Student的字节码文件
        Class<Student> studentClass = Student.class;
        //暴力获取单个所有权限无参构造方法
        Constructor<Student> constructor = studentClass.getDeclaredConstructor();
        //取消检查权限
        constructor.setAccessible(true);
        //实例化
        Student stu1 = constructor.newInstance();
        Student stu2 = constructor.newInstance();
        //暴力反射内部成员变量
        Field name = studentClass.getDeclaredField("name");
        Field age = studentClass.getDeclaredField("age");
        //因为是暴力获取,得设置访问权限
        name.setAccessible(true);
        age.setAccessible(true);
        //通过set给成员变量赋值
        name.set(stu1,"杏菜");
        name.set(stu2,"佳树");
        age.set(stu1,15);
        age.set(stu2,13);
        System.out.println(name.get(stu1));
        System.out.println(name.get(stu2));
    }
}

反射的建议:禁止暴力反射

小知识点Java中的泛型是假的只有在编译期间有效

public class Test1 {
    //在一个泛型为Integer的集合里面添加一个字符串
    //思路Java中的泛型是假的只有在编译期间有效
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,4);
        Class<? extends ArrayList> class1 = list.getClass();
        Method add = class1.getMethod("add", Object.class);
        add.invoke(list,"hhh");
        System.out.println(list);
    }
}

方法引用:

image-20260106153259853

Junit单元测试

image-20260106153751296

总结:

image-20260106154607624