自定义类加载器,利用反射加载任意路径下的class文件

package test2;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 自定义的类加载器
 * @author linxz
 *
 */
public class NewClassLoader extends ClassLoader {
	private static NewClassLoader loader=new NewClassLoader();
	/**
	 * @param name class类的文件名
	 */
//	@Override
//	protected Class<?> findClass(String name) throws ClassNotFoundException {
//		byte[] datas = loadClassData(name,location);//将class文件的数据读入到byte数组中  
//		return defineClass(name, datas, 0, datas.length);//通过byte数组加载Class对象
//	}
	/**
	 * @param name class 类的文件名
	 * @param pack 类所在的包名 eg:com.szelink.test.  后面需要带个"."<br>
	 * @param location 类文件的路径,设定目录时,需要在最后带上"/"
	 * 自定义路径获取Class对象
	 */
	public static Class<?> findClassByNameAndLocation(String name,String pack,File location) throws ClassNotFoundException{
		byte[] datas = loader.loadClassData(name,location);     //将class文件的数据读入到byte数组中
		pack=loader.convert(pack);
		return loader.defineClass(pack+name, datas, 0, datas.length);//通过byte数组加载Class对象
	}
	/**
	 * 
	 * @param pack 类所在的包名 eg:com.szelink.test.  后面需要带个"."
	 * @param location 包所在的路径
	 * @return
	 */
	public static Map<String,Class> findClassesByLocation(String pack,File location){
		//列出所有的.class文件
		File[] childFiles=location.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				if(name.indexOf(".class")<=-1)
					return false;
				else
					return true;
			}
		});
		Map<String,Class> map=new HashMap<String, Class>();
		for(File f:childFiles){
			String name=f.getName().substring(0,f.getName().indexOf(".class"));
			Class c=null;
			try {
				c = findClassByNameAndLocation(name, pack, location);
				System.out.println(c.getName());
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			map.put(name, c);
		}
		return map;
	}
	/**
	 * 将.class文件读入到byte[]数组中
	 * @param name 要读取的文件名称
	 * @param location 要读取的文件目录
	 * @return 读取到的byte[]数组
	 */
	protected byte[] loadClassData(String name,File location)  
	    {  
	    FileInputStream fis = null;  
	     byte[] datas = null;  
	    try  
	    {  
	       //File dir=new File(location);
	       File classFile=new File(location,name+".class");
	       fis = new FileInputStream(classFile);
	       //fis = new FileInputStream(location+name+".class");  
	       ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	        int b;  
	        while( (b=fis.read())!=-1 )  
	         {  
	         bos.write(b);  
	         }  
	        datas = bos.toByteArray();  
	        bos.close();  
	     }catch(Exception e)  
	     {  
	         e.printStackTrace();  
	     }  
	     finally  
	     {  
	         if(fis != null)  
	        try  
	         {  
	             fis.close();  
	        } catch (IOException e)  
	         {  
	             e.printStackTrace();  
	         }  
	     }  
	     return datas;  
	
	  }
	/**
	 * 转换包名
	 * @param pack 要转换的包名
	 * @return
	 */
	private String convert(String pack){
		String result="";
		result=pack.replace('/', '.');//将所有的/转成.
		result=result.replace('\"', '.');//将所有的\转成.
		result=result.replace('\\', '.');
		if(!(result.substring(result.length()-1)).equals(".")){//判断最后一位是否为.,若不是,加上一个.
			result+=".";
		}
		return result;
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值