1. 程式人生 > >Java 掃描包下所有類(包括jar包)

Java 掃描包下所有類(包括jar包)

package com.MyUtils.file;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;


/**
 * 掃描包下路徑 
 * 包括本地檔案和jar包檔案
 * @author ljb
 *
 */
public class ScanningFile {
	
	private Class<?> superStrategy = String.class;//介面類class 用於過濾 可以不要
	
	private List<Class<? extends String>> eleStrategyList = new ArrayList<Class<? extends String>>();
	
	private ClassLoader classLoader = ScanningFile.class.getClassLoader();//預設使用的類載入器
	
	private static final String STARATEGY_PATH = "com.MyUtils.file";//需要掃描的策略包名
	
	public static void main(String[] args) {
		ScanningFile s = new ScanningFile();
		s.addClass();
	}
	 
    /**
	 * 獲取包下所有實現了superStrategy的類並加入list
	 */
    private void addClass(){
    	URL url = classLoader.getResource(STARATEGY_PATH.replace(".", "/"));
		String protocol = url.getProtocol();  
        if ("file".equals(protocol)) {  
            // 本地自己可見的程式碼  
       	    findClassLocal(STARATEGY_PATH);
        } else if ("jar".equals(protocol)) {  
            // 引用jar包的程式碼  
            findClassJar(STARATEGY_PATH);  
        }  
    }
    
    /**
     * 本地查詢
     * @param packName
     */
	private void findClassLocal(final String packName){
		URI url = null ;
		try {
			url = classLoader.getResource(packName.replace(".", "/")).toURI();
		} catch (URISyntaxException e1) {
			throw new RuntimeException("未找到策略資源");
		}
		
		File file = new File(url);
		file.listFiles(new FileFilter() {
				
				public boolean accept(File chiFile) {
					if(chiFile.isDirectory()){
						findClassLocal(packName+"."+chiFile.getName());
					}
					if(chiFile.getName().endsWith(".class")){
						Class<?> clazz = null;
						try {
							clazz = classLoader.loadClass(packName + "." + chiFile.getName().replace(".class", ""));
						} catch (ClassNotFoundException e) {
							e.printStackTrace();
						}
						System.out.println(chiFile);
						if(superStrategy.isAssignableFrom(clazz)){
							eleStrategyList.add((Class<? extends String>) clazz);
						}
						return true;
					}
					return false;
				}
			});
		 
	}
	
	/**
	 * jar包查詢
	 * @param packName
	 */
	private void findClassJar(final String packName){
		String pathName = packName.replace(".", "/");
		JarFile jarFile  = null;
		try {
			URL url = classLoader.getResource(pathName);
			JarURLConnection jarURLConnection  = (JarURLConnection )url.openConnection();
			jarFile = jarURLConnection.getJarFile();  
		} catch (IOException e) {
			throw new RuntimeException("未找到策略資源");
		}
		
		Enumeration<JarEntry> jarEntries = jarFile.entries();
        while (jarEntries.hasMoreElements()) {
            JarEntry jarEntry = jarEntries.nextElement();
            String jarEntryName = jarEntry.getName();
            
            if(jarEntryName.contains(pathName) && !jarEntryName.equals(pathName+"/")){
            	//遞迴遍歷子目錄
            	if(jarEntry.isDirectory()){
            		String clazzName = jarEntry.getName().replace("/", ".");
                    int endIndex = clazzName.lastIndexOf("."); 
                    String prefix = null;  
                    if (endIndex > 0) {  
                    	prefix = clazzName.substring(0, endIndex);  
                    }  
                    findClassJar(prefix);
            	}
            	if(jarEntry.getName().endsWith(".class")){
    				Class<?> clazz = null;
    				try {
    					clazz = classLoader.loadClass(jarEntry.getName().replace("/", ".").replace(".class", ""));
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    				if(superStrategy.isAssignableFrom(clazz)){
    					eleStrategyList.add((Class<? extends String>) clazz);
    				}
            	}
            }
            
        }
		 
	 }
	
}

可以去過濾實現了特點介面的類

相關推薦

Java 掃描所有包括jar

package com.MyUtils.file;import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; i

史上最完整掃描所有Jar掃描,maven子專案掃描

要掃描包下的所有類,分類路徑下掃描和jar包掃描兩種,其中jar包掃描又分專案中引入的三方jar包,同級maven的多個子專案jar相互引用,還有jdk jar包(這裡不考慮,一般沒哪個專案會掃描jdk jar包裡的類). 我先宣告一個介面,用於應對不同型別的class

獲取所有中的註解的值 java工具

作用:這個工具類主要的作用就是獲取類中的註解的值。 應用場景:做許可權的時候獲取@RequestMapping();的值,自動新增到資料庫中。 /** * getRequestMappingValue方法描述: * 作者:thh

java 遍歷指定所有,返回完整名。工具,可以直接拷入使用

1、說明:       此類為本人開發的工具類,具體應用在什麼地方呢。本人在實際專案中,許可權管理這一塊有所應用,應該是許可權這一塊有所需求而開發的。 應用場景說明:許可權資源自動化生產時,使用者點選介面的一鍵生成資源時,介面中就會遍歷指定controller包下所有

java.util.concurrent

文章整理來源:http://www.cnblogs.com/aurawing/articles/1887056.html 一 ,背景: 在JDK1.5之前,Java中要進行業務併發時,通常需要有程式設計師獨立完成程式碼實現,當然也有一些開源的框架提供了這些功能,但是這些依然沒有JDK自帶的功

springboot怎樣掃描與啟動非同也非子javaBean

一般來說springboot只會掃描啟動類當前包和以下的子包中的javabean,但如果非要訪問其他包的話, 也就是如何裝配到IOC容器中,其實也是有辦法的。 第一種: 首先,我們先在外面建立一個Java類,並且在與啟動類同包下建立一個util/PeopleConfiguration.j

複製一個資料夾所有檔案包括子資料夾並修改檔案字尾名 java實現加密文件unlock

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.i

java 遞迴呼叫自動讀取某資料夾所有檔案遞迴呼叫

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; public cl

Linux C 讀取資料夾所有檔案包括子資料夾的檔名

Linux C  下面讀取資料夾要用到結構體struct dirent,在頭#include <dirent.h>中,如下: #include <dirent.h> struct dirent { long d_ino; /* inode number 索引節點號

Python計算一個目錄所有檔案包括子目錄中所有檔案指定的檔案型別個數

 輸入工程名計算一個工程專案中C++,Java,Python,GO語言的檔案個數,並找出Python檔案中最大檔案的檔名 1、先讀取檔案地址,找到該資料夾 import os import os.path path = 'C:/python學習/Python作業/' +

Log4j之設定所有的appender篇

log4j.properties #指定某個包下的所以類呼叫指定的appender log4j.logger.com.coderdream.log4j=debug,appender1 log4j.logger.com.coderdream.log4jDao=info,app

Java之eclipse將工具打成Jar、使用jar、以及刪除jar

Eclipse如何匯出jar包??? 選中對應的工具類,右鍵==>Export... ==>選中Java目錄下的JAR File==>Next==>選擇匯出路徑==>Fi

java通過http請求工具包含檔案傳輸

package test;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStreamReader;import java.nio

Java之請求傳送工具HttpClientUtils,爬蟲-yellowcong

Java傳送請求,之前做過一段時間的爬蟲,所以寫了這個請求傳送的工具,這個工具偽裝成百度,然後去爬取推酷的資料,當時是由於推酷有ip訪問限制,你如果是爬蟲,就不讓訪問了,所以我偽裝成了百度,然後就可以隨便爬取推庫的資料了,當時爬了1GB多的文字資料,然後圖

java端使用IText下載PDF.包含JAR

java後臺生成PDF傳給前臺介面,前臺介面生成下載連結IText, 所用的jar包百度雲資源(itextpdf-5.5.8,itext-asian) 不會發生什麼配置檔案丟失的jar包,我也是翻了好久才找到。 連結:https://pan.baidu.c

根據父獲取同一個包括所有

宣告:文章內容全都是自己的學習總結,如有不對的地方請大家幫忙指出。有需要溝通交流的可加我QQ群:425120333 Java語言的三大特性是繼承、封裝、多型。繼承指的是子類通過關鍵字extends繼承父類、或者是implements實現介面。不管

找到父節點所有子節點包括子節點

新增 not tab clas ren while blog url pkg CREATE TABLE `tab_menu` ( `MU_ID` int(10) NOT NULL AUTO_INCREMENT COMMENT ‘主鍵‘, `MU_NAME`

Java遍歷所有方法註解

|| asm 服務器 ret nec next 代碼 自定義 tco 一.代碼實例 import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.l

java在window用cmd javac、jar命令行模擬Intellij IDEA軟件生成jar

cmd cti 最重要的 ron 路徑 alloc 不可 alt CP @@首先最重要的cmd命令: javac ,jar :使用如下(註意[.]不要輸錯): 1. javac編譯: D:\MyWorkSet\idea_hadoop>javac -d .\out

Java基礎知識-java.util.concurrent常見的使用

finall iss con value 通信 out 否則 app ted 一,Condition 一個場景,兩個線程數數,同時啟動兩個線程,線程A數1、2、3,然後線程B數4、5、6,最後線程A數7、8、9,程序結束,這涉及到線程之間的通信。 public class