JAvaパッケージスキャン————開山怪

17541 ワード

パッケージスキャン
1.パッケージスキャンプロセス
パケットスキャンは、実際には、パケット名によって、パケットの下にあるフォルダの下にあるすべてのclassファイルをスキャンし、処理する必要がある.classファイルは事前に取得を提供する.classファイルの手段です.パケットの名前を指定するだけで、パケットの下のすべてをスキャンすることができる.classファイル.実際にパッケージはフォルダに相当します.では、提供されたパッケージ名を処理して、そのパッケージの下のすべてのクラスを自動的にスキャンできるようにする必要があります.
First :
パッケージ名でURLを取得し、URLからそのパッケージが通常のパッケージかjarかを判断する
Second:
普通のバッグなら、判断を下す必要があります.2つの状況に分けます.このパッケージの下に直接サブファイル(.classファイル)2があります.このパッケージの下にサブフォルダが存在する場合、私たちはまたこのフォルダを普通のパッケージと見なして、どの2つの状況に属しているかを判断しなければなりません.
実はこのステップでは再帰の方法を採用していますが、以前は再帰にもあまり熟練していませんでしたが、いつ敵対するか分かりません.このステップには良い例で、良い方法で理解しています==再帰は本層がしなければならないことだけを考えています.
通常のパッケージでは、clasがファイルであることをスキャンすることが最終的な目的ですが、このときブロックされるのは、classファイルではなく、classファイルが含まれている可能性があります.これらのフォルダにはclassファイルが含まれている可能性があります.ループのような感じです.
では、私があげた方法はdealDirectory(String rootName,File curFile)です.この方法で通常のパッケージを処理することは、私たちの本層が分析し、実現しなければならないことと見なすことができます.そのレベルで私たちがしなければならないことは、上記の2つの状況を判断することです.1つのパッケージ名にとって2つの状況にほかならないので、dealDirectory(String rootName,File curFile)がしなければならないことは2つの判断をすることです.curFileファイルの下にフォルダがある場合は自分(つまりdealDirectory()を呼び出します.この場合のフォルダは通常のパッケージと見なすことができるので)、curFileファイルの下にclassファイルがある場合は、直接ファイルとして処理します.
Third :
jarパッケージであれば、classファイルと判断してファイルとして処理し、その他は処理しません.
2.コード

public abstract class PackageScanner {
	public PackageScanner() {
	 }
	public abstract void dealClass(Class<?> className);
	private void dealFile(String rootName, File curFile) {
	     String fileName = curFile.getName();
		      
	     if (fileName.endsWith(".class")) {
		fileName = fileName.replace(".class", ""); 
		try {    
		   Class<?> klass = Class.forName(rootName + "." + fileName);
		   dealClass(klass);
	        } catch (Exception e) {
		   e.printStackTrace();
	        }
	      }  
	}
	private void dealDirectory(String rootName, File curFile) {
	 //    curFile               
	      File[] fileList = curFile.listFiles();
		 
	      for(File file : fileList) {	  
		 if (file.isDirectory()) {  
		   dealDirectory("rootName" + file.getName(), file);
		  } else if(file.isFile()){   
		   dealFile(rootName, file);   
		  }
	      }
		 
	}
	private void dealJarPackage(URL url) {
	      try {
		  JarURLConnection connection = (JarURLConnection) url.openConnection();
		  JarFile jarFile = connection.getJarFile();
		  Enumeration<JarEntry> jarEntries = jarFile.entries();
		  while (jarEntries.hasMoreElements()) {
		     JarEntry jar = jarEntries.nextElement();
		   
		     if(jar.isDirectory() || !jar.getName().endsWith(".class")) {
		         continue;
		     }   
		     String jarName = jar.getName(); 
		     jarName = jarName.replace(".class", "");
		     jarName = jarName.replace("/", ".");
		   
		     try {
		        Class<?> klass = Class.forName(jarName);
		        dealClass(klass);
		     } catch (ClassNotFoundException e) {
		         e.printStackTrace();
		     }
		  }
	      } catch (IOException e) {
		  e.printStackTrace();
	      }
	}
	public void scannPackege(String  packegeName) {
	    String rootName = packegeName; 
	    //     XX.xx.xx   xx/xx/xx/
	    //   xx/xx/xx/              url,   url   file  jar
	 
	    packegeName = packegeName.replace(".", "/");
	    URL url = Thread.currentThread().getContextClassLoader().getResource(packegeName); 
	    if (url.getProtocol().equals("file")) {
	      //     
	       try {
	          URI uri = url.toURI();
	          File root = new File(uri); 
	         //root     packegeName     
	          dealDirectory(rootName, root);  
	        } catch (Exception e) {
	            e.printStackTrace();
	        } 
             } else {
	         //  jar 
	       dealJarPackage(url);
	     } 
	}
}
	
	
	
	```