七、类加载器

本文详细介绍了Java类加载器的概念及其工作原理,包括类加载器的类型、如何使用类加载器获取类对象以及查看类对象的类加载器。此外,还讲解了自定义类加载器的方法,并探讨了类加载器的委托、可见性和单一性机制。

1.概念

     类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。

2.使用类加载器获取类对象

3.查看类对象的类加载器

4.类加载器的类型

   <1>应用类加载器App:加载自己写的类或者jar包下面的类
   <2>扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包
   <3>根类加载器null:加载jdk/jre/lib/jar(所有类加载器的父加载器)

     首先要写一个Person实体类,以下是测试类

package com.zking.test;

import org.junit.Test;


/**
 * 测试包
 * 类加载器
 */
public class TestClassLoader {
	 /**
	  * 以前new一个对象
	  */
	   @Test
	   public void test1(){
		      Person person=new Person();
		      person.setPname("张三");//设值
	          System.out.println(person.getPname());//打印
	   }
	   
	   /**
	    * 通过类加载器获取对象
	    */
	   @Test
	   public void test2(){
		      try {
		    	  //获取类对象
		    	  Class clazz=Class.forName("com.zking.entity.Person");
		    	  //通过类对象直接拿
		    	  Person per=(Person)clazz.newInstance();
 	              per.setPname("李四");
		          System.out.println(per.getPname());
		    	  
			      //获取类加载器
		    	  ClassLoader cl=clazz.getClassLoader();
		    	  //查询该类加载器的类型(应用类加载器App:加载自己写的类或者jar包下面的类App)
		          System.out.println(cl);//打印:sun.misc.Launcher$AppClassLoader@6b97fd
		    	  
		          //获取 超类的 类加载器
		          //ClassLoader clParent=clazz.getSuperclass().getClassLoader();
		          //System.out.println(clParent);//打印超类:
		    	  ClassLoader clParent=cl.getParent();//扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包
		    	  System.out.println(clParent);//打印:sun.misc.Launcher$ExtClassLoader@1c78e57
		    	  
		    	  //
		    	  ClassLoader clGrandParent=clParent.getParent();
		    	  System.out.println(clGrandParent);
		    	  
		      } catch (Exception e) {
			      // TODO Auto-generated catch block
			      e.printStackTrace();
	           }
	   }
	   
}


5.自定义类加载器

package com.zking.diy;

import java.io.FileInputStream;

/**
 * 自定义类加载器:自己写一个类继承人家的类,再改一改
 */
public class ClassLoaderDIY extends ClassLoader{
	
//重写方法:findClass+Alt+/
		@Override
		protected Class<?> findClass(String name) throws ClassNotFoundException {
			    System.out.println("自定义类加载器");//测试语句
			    System.out.println(name);
			    name=name.replaceAll("\\.", "/");//所有的.替换成\
			    System.out.println("替换后:"+name);
			    
			    //截取
			    int a=name.lastIndexOf("/");
			    name=name.substring(a+1);
			    
			    String desktopPath="C:\\Users\\Administrator.USER-20170515AI\\Desktop\\"+name+".class";
			    System.out.println(desktopPath);
			    try {
					FileInputStream fis=new FileInputStream(desktopPath);
					System.out.println(fis.available());
					int len=0;
					byte[] b=new byte[fis.available()];
					len=fis.read(b);
					return defineClass(null, b, 0, len);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return null;
		}
		
		
		
}
package com.zking.test;

import org.junit.Test;

import com.zking.diy.ClassLoaderDIY;

public class TestClassLoaderDIY {

	   @Test
	   public void test() throws InstantiationException, IllegalAccessException{
		    //使用自己的类加载器 加载对象
	        try {
			    Class clazz=Class.forName("com.zking.entity.Person", true, new ClassLoaderDIY());
			    System.out.println(clazz.newInstance());
	        } catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
	   }
	  
}

6.类加载器的工作原理:委托、可见性、单一性

   委托机制

当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目录,而PATH是定义的是可执行程序如javac,java等的执行路径。

  可见性机制

根据可见性机制,子类加载器可以看到父类加载器加载的类,而反之则不行。所以下面的例子中,当Abc.class已经被Application类加载器加载过了,然后如果想要使用Extension类加载器加载这个类,将会抛出java.lang.ClassNotFoundException异常。

  单一性机制

根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加载器是可能的,但这样做并不可取。你写自己的类加载器的时候应该严格遵守这三条机制。


7.网络类加载器(可以了解一下,如果有时间博主会补充上)


最后,欢迎大家来指出博主的错误之处。


【电动车优化调度】基于模型预测控制(MPC)的凸优化算法的电动车优化调度(Matlab代码实现)内容概要:本文介绍了基于模型预测控制(MPC)的凸优化算法在电动车优化调度中的应用,并提供了Matlab代码实现。该方法结合了MPC的滚动优化特性与凸优化的高效求解能力,用于解决电动车充电调度问题,提升电网运行效率与可再生能源消纳能力。文中还提及多个相关研究方向和技术支撑,包括智能优化算法、机器学习、电力系统管理等,展示了其在多领域交叉应用的潜力。配套资源可通过提供的网盘链接获取,涵盖YALMIP工具包及其他完整仿真资源。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的科研人员和研究生,尤其适合从事电动汽车调度、智能电网优化等相关课题的研究者。; 使用场景及目标:①实现电动车集群在分时电价或电网需求响应机制下的有序充电调度;②结合可再生能源出力与负荷预测,利用MPC进行多时段滚动优化,降低电网峰谷差,提高能源利用效率;③为学术论文复现、课题研究及工程仿真提供可靠的技术路线与代码支持。; 阅读建议:建议读者结合文档中提到的智能优化算法与电力系统背景知识进行系统学习,优先掌握MPC基本原理与凸优化建模方法,并下载配套资源调试代码,以加深对电动车调度模型构建与求解过程的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值