黑马程序员——类加载器的原理和编写

-------  android培训java培训、期待与您交流! ----------  
     类加载器就是加载类的工具 可以有多个类加载器,JVM默认三个类加载器,Bootstrap,ExtClassLoader,AppClassLoader,它们三个继承关系是:Bootstrap是ExtClassLoader的父类,ExtClassLoader是AppClassLoader的父类。 有一个不是java类加载器,bootStrap(比如System就是它加载的),他是内核,c++写的。其他类加载器也都是java类  
    它们启动的目录分别如下:
    bootstrap---jre/lib/rt.jar
    extclassloader---jar/lib/ext/*.jar
    appclassloader---classpath制定的所有jar或目录
    myclassloader---自己制定的特殊目录
    那实际应用中用哪个类加载呢 ?  首先是当前线程的类加载器加载线程中的第一个类。先委托父类,父类再委托给父类,如果找不到在一级一级的往下返回,如果父类们都加载不到就用当前类加载。如果当前类加载不了就报错,不会往下找。
    下面就编写一个自己的类,编写自己的类加载器,必须继承一个抽象类ClassLoader,它有一个方法loadclass是找父类,findclass是自己做,所以覆盖findclass即可。
    步骤:
    1.编写一个对文件内容进行简单加密的程序。
    2.编写了一个自己的类装载器,可实现对加密过的类进行装载和解密。
    3.编写一个程序用类加载器加载类。
package cn.itcast.day1;


import java.util.Date;

public class ClassLoaderAttachment extends Date {
	public String toString()
	{
		return "hello,world";
	}

}



package cn.itcast.day1;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MyClassLoader extends ClassLoader{

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		String srcPath=args[0];
		String destDir=args[1];
		FileInputStream fis=new FileInputStream(srcPath);
		String destFileName=srcPath.substring(srcPath.lastIndexOf('\\')+1);
		String destPath=destDir+"\\"+destFileName;
		FileOutputStream fos=new FileOutputStream(destPath);
		cypher(fis,fos);
		fis.close();
		fos.close();
	}
	private static void cypher(InputStream ips,OutputStream ops) throws IOException{
		int b=-1;
		while((b=ips.read())!=-1){
			ops.write(b^0xff);
		}
	}
	private String classDir;
	@Override
	protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
		String classFileName=classDir+"\\"+name+".class";
		try {
			FileInputStream fis = new FileInputStream(classFileName);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			cypher(fis, bos);
			fis.close();
			byte[] bytes = bos.toByteArray();
			return defineClass(bytes, 0, bytes.length);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		//return super.findClass(name);
		return null;
	};

	public MyClassLoader(){
		
	}
	public MyClassLoader(String classDir){
		this.classDir=classDir;
	}
}



package cn.itcast.day1;

import java.util.Date;

public class ClassLoaderTest {

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		System.out.println(ClassLoaderTest.class.getClassLoader().getClass().getName());
		System.out.println(System.class.getClassLoader());
		
		
		ClassLoader loader=ClassLoaderTest.class.getClassLoader();
		while(loader!=null){
			System.out.println(loader.getClass().getName());
			loader=loader.getParent();
		}
		System.out.println(loader);
		
		
		//System.out.println(new ClassLoaderAttachment().toString());
		
		Class clazz=new MyClassLoader("itcastlib").loadClass("ClassLoaderAttachment");
		Date d1=(Date)clazz.newInstance();
		System.out.println(d1);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值