类加载器
ClassLoader
1.//.class文件通过 JVM 读取到内存当中 然后基于 .class类创建一个Class对象
2.获取本类的Class对象
Class cls= 类名.class;
Class cls=对象名.getClass;
Class cls=Class.forName("类的全限定名");//即使类不存在,编写代码也不会报错
3.作用
(1)获取类加载器对象 ClassLoader app=cls.getClassLoader();
//结合properties使用
Properties prop=new Properties();
prop.load(类加载器对象.getResourceAsStream("配置文件"));
String className= prop.getProperty("className");
Class StudentClass = Class.forName(className);
(2)获取父类加载器 ClassLoader parent=app.getParent();
(3)获取实体类对象 Student stu=StuClass.newInstance();//必须有无参构造
双亲委派模型
//存在继承关系
爷类 启动类加载器 加载java运行环境提供的环境 bin 返回 null
父类 扩展类加载器:加载java运行环境提供的扩展环境 lib 返回 加载器类的对象
子类 应用程序类加载器:加载程序员自己定义的类 student类 返回 加载器类的对象
(1)当加载一个类时,先判断此类是否已经被加载,如果类已经被加载则返回
(2)如果类没有被加载,则先委托父类加载进行判断,如果父类加载过则返回;如果没被加载过则继续向上委托;
(3)如果一直委托都无法加载,子类加载器才会尝试自己加载
反射
反射机制:对于任意类,任意对象,都能动态获取的信息及调用对象的方法 --映射java对象利用其功能进行操作
反射原理:运行前,计算机不知道类的内容,并且还要在运行时获取类的内容,进行调用其方法
暴力反射:对私有属性以及私有方法的调用 私有-->暴力(重要)*****setAccessible(); //暴力反射
1.//Constrcutor
(1)//获取对象 (无参或有参)
Constructor<类名>[] cons=Class对象.getConstructor(类型.class,类型.class);//public
Constructor<类名>[] cons=Class对象.getDeclaredConstructor(类型.class,类型.class);//所有
(2)//Constrcutor的API
user use=cons.newInstance();//创建对象-->通过创建对象的setxx方法给对象赋值
//操作步骤
(1) 1.Class cls=Class.forName(className); //配置文件或路径
2.Class<user> cls= user.class; //已知对象名
(2) Constructor<类名> cons=Class对象.getDeclaredConstructor(类型.class,类型.class);
(3) 判断是否用暴力 setAccessible(ture);//暴力反射 ture 开启
(4) user use=cons.newInstance("熊大","123456");
2.//Method
(1)//获取方法 (无参或有参)
Method<类名>[] m=Class对象.getMethod("方法名".类型.class);//public
Method<类名>[] m=Class对象.getDeclaredMethod("方法名",类型.class);//所有
(2)invoke(实体类对象,参数);
//操作步骤
(2) Method<类名> m=StuClass.getDeclaredMethod();
(3) 判断是否用暴力 setAccessible(ture);//暴力反射 ture 开启
(4) [1] m.invoke(null,参数);//静态方法
[2] user use=userClass.newInstance();//User必须含有无参构造
m.invoke(use,参数);//成员方法
注解
1.//自定义注解
public @interface MyAnnotation {
//基本数据类型 String Class 枚举 注解 所有类型的一维数组形式
public 属性类型 属性名() default 默认值; //当没有指定值时,使用默认值
}
2.//元注解 修饰注解的注解
(1)@Target //限定自定义注解的书写位置
1.TYPE 类,接口
2. FIELD 成员变量
3.METHOD 成员方法
4.CONSTRUCTOR 构造器
5.LOCAL_VARIABLE 局部变量
(2)@Retention //约束自定义约束的生命周期
(3)@Before//进行@Test之前都进行@Before操作(理解:静态代码块->mian之前必须加载)