黑马程序员:工具类获取指定包名下的所有类由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“黑马程序员学费多少”。
分享一个获取指定包名下所有类的工具类,代码如下
1.2.3.4.5.6.7.8.9.import java.io.File;import java.io.FileFilter;
import java.lang.annotation.Annotation;import java.net.JarURLConnection;import java.net.URL;
import java.util.ArrayList;import java.util.Enumeration;import java.util.List;
import java.util.jar.JarEntry;
10.import java.util.jar.JarFile;11.12.public cla ClaUtil { 13.// 获取指定包名下的所有类 14.public static List> getClaList(String packageName, boolean isRecursive){
15.List> claList = new ArrayList>();16.try { 17.Enumeration
urls
= Thread.currentThread().getContextClaLoader().getResources(packageName.replaceAll(“.”, “/”));
18.while(urls.hasMoreElements()){ 19.URL url = urls.nextElement();20.if(url!= null){
21.String protocol = url.getProtocol();22.if(protocol.equals(“file”)){
23.String packagePath = url.getPath();
24.addCla(claList, packagePath, packageName, isRecursive);
25.} else if(protocol.equals(“jar”)){ 26.27.28.JarURLConnection jarURLConnection =(JarURLConnection)url.openConnection();
JarFile
jarFile
= jarURLConnection.getJarFile();
Enumeration jarEntries = jarFile.entries();
29.while(jarEntries.hasMoreElements()){
30.JarEntry jarEntry = jarEntries.nextElement();
31.String jarEntryName = jarEntry.getName();32.if(jarEntryName.endsWith(“.cla”)){ 33.String
claName
= jarEntryName.substring(0, jarEntryName.lastIndexOf(“.”)).replaceAll(“/”, “.”);
34.{
if(isRecursive || claName.substring(0, claName.lastIndexOf(“.”)).equals(packageName))35.claList.add(Cla.forName(claName));
36.} 37.} 38.} 39.} 40.} 41.}
42.} catch(Exception e){ 43.e.printStackTrace();44.}
45.return claList;46.} 47.48.// 获取指定包名下的所有类(可根据注解进行过滤)49.public static List> getClaListByAnnotation(String packageName, Cla extends Annotation> annotationCla){
50.List> claList = new ArrayList>();51.try { 52.Enumeration
urls
= Thread.currentThread().getContextClaLoader().getResources(packageName.replaceAll(“.”, “/”));
53.while(urls.hasMoreElements()){ 54.URL url = urls.nextElement();55.if(url!= null){
56.String protocol = url.getProtocol();57.if(protocol.equals(“file”)){
58.String packagePath = url.getPath();
59.addClaByAnnotation(claList, packagePath, packageName, annotationCla);
60.} else if(protocol.equals(“jar”)){ 61.62.63.JarURLConnection jarURLConnection =(JarURLConnection)url.openConnection();
JarFile
jarFile
= jarURLConnection.getJarFile();
Enumeration jarEntries = jarFile.entries();
64.while(jarEntries.hasMoreElements()){ 65.JarEntry
jarEntry
= jarEntries.nextElement();
66.String jarEntryName = jarEntry.getName();67.if(jarEntryName.endsWith(“.cla”)){ 68.String
claName
= jarEntryName.substring(0, jarEntryName.lastIndexOf(“.”)).replaceAll(“/”, “.”);
69.70.Cla> cls = Cla.forName(claName);
if(cls.isAnnotationPresent(annotationCla)){
71.claList.add(cls);72.} 73.} 74.} 75.} 76.} 77.}
78.} catch(Exception e){ 79.e.printStackTrace();80.}
81.return claList;82.} 83.84.private static void addCla(List> claList, String packagePath, String packageName, boolean isRecursive){
85.try {
86.File[] files = getClaFiles(packagePath);
87.if(files!= null){
88.for(File file : files){
89.String fileName = file.getName();90.if(file.isFile()){
91.String claName = getClaName(packageName, fileName);
92.claList.add(Cla.forName(claName));93.} else {
94.if(isRecursive){ 95.96.97.String subPackagePath = getSubPackagePath(packagePath, fileName);
String subPackageName = getSubPackageName(packageName, fileName);
addCla(claList, subPackagePath, subPackageName, isRecursive);
98.} 99.} 100.} 101.}
102.} catch(Exception e){ 103.e.printStackTrace();104.} 105.} 106.107.private static File[] getClaFiles(String packagePath){ 108.return new File(packagePath).listFiles(new FileFilter(){ 109.@Override
110.public boolean accept(File file){ 111.return
(file.isFile()
&& file.getName().endsWith(“.cla”))|| file.isDirectory();
112.} 113.});114.} 115.116.private static String getClaName(String packageName, String fileName){
117.String claName = fileName.substring(0, fileName.lastIndexOf(“.”));
118.if(org.apache.commons.lang.StringUtil.isNotEmpty(packageName)){
119.claName = packageName + “.” + claName;120.}
121.return claName;122.} 123.124.private static String getSubPackagePath(String packagePath, String filePath){
125.String subPackagePath = filePath;126.if(org.apache.commons.lang.StringUtil.isNotEmpty(packagePath)){
127.subPackagePath = packagePath + “/” + subPackagePath;128.}
129.return subPackagePath;130.} 131.132.private static String getSubPackageName(String packageName, String filePath){
133.String subPackageName = filePath;134.if(org.apache.commons.lang.StringUtil.isNotEmpty(packageName)){
135.subPackageName = packageName + “.” + subPackageName;136.}
137.return subPackageName;138.} 139.140.private static void addClaByAnnotation(List> claList, String packagePath, String packageName, Cla extends Annotation> annotationCla){
141.try {
142.File[] files = getClaFiles(packagePath);143.if(files!= null){
144.for(File file : files){
145.String fileName = file.getName();146.if(file.isFile()){
147.String claName = getClaName(packageName, fileName);
148.Cla> cls = Cla.forName(claName);149.if(cls.isAnnotationPresent(annotationCla)){
150.claList.add(cls);151.} 152.} else { 153.154.155.String
subPackagePath
= getSubPackagePath(packagePath, fileName);
String
subPackageName
= getSubPackageName(packageName, fileName);
addClaByAnnotation(claList, subPackagePath, subPackageName, annotationCla);
156.} 157.} 158.}
159.} catch(Exception e){ 160.e.printStackTrace();161.} 162.} 163.}