# 日志
## 日志框架


# 枚举
**一般用作信息的标记和分类**

## 枚举的特点
作用:
代码优雅,可读性高,入参约束严谨
# 类加载器
**过程**
类加载器的分类

**双亲委派模型:**
# 反射:
## 如何创建类的字节码对象:
## 反射类中的构造方法
其中返回单个构造方法对象括号中给的参数是可变参数,给的是字节码文件参数,用来代表返回的是有参构造还是无参构造,可看下边例子

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

其中newInstance方法中的参数代表了是走的带参构造还是无参构造
```Java
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);
}
}
```
## 反射类中的成员变量:

## 设置成员变量的方法

例子:
```Java
public class Demo2 {
public static void main(String[] args)throws Exception{
//获取Student的字节码文件
Class studentClass = Student.class;
//暴力获取单个所有权限无参构造方法
Constructor 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中的泛型是假的,只有在编译期间有效
```Java
public class Test1 {
//在一个泛型为Integer的集合里面添加一个字符串
//思路:Java中的泛型是假的,只有在编译期间有效
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList 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);
}
}
```
# 方法引用:
# Junit单元测试:
## 总结:
