类加载器及其用法

本文详细阐述了Java中的类加载器如何工作,包括双亲委派模型,以及反射机制如何动态获取和调用类的方法。还介绍了如何使用自定义注解和元注解进行元编程。
摘要由CSDN通过智能技术生成

类加载器

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之前必须加载)       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值