クラスの検索、前回の投稿、なぜか文字が読みにくいので再投稿
import java.io.File;
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;
public final class ClassUtil{
private ClassUtil(){}
/**
* package名 を指定して、配下のクラス名(インナークラスを除く)を検索する。
* @param packagename package名
* @return クラス名配列
*/
public static String findClass(String packagename){
List<String> list = new ArrayList<String>();
if (packagename==null || packagename.length() < 0)
return list.toArray(new String{});
try{
String target = packagename.replaceAll("\\.","/");
if (!target.endsWith("/")) target = target + "/";
URL url = ClassLoader.getSystemClassLoader().getResource(target);
if (url.getProtocol().equals("jar")){
String path = url.toString().replaceFirst("jar:file:","");
path = path.substring(0,path.indexOf("!"));
JarFile jarfile = new JarFile(new File(path));
for(Enumeration<JarEntry> en=jarfile.entries();en.hasMoreElements();){
JarEntry entry = en.nextElement();
String s = entry.getName();
if (s.startsWith(target)
&& s.indexOf("$") < 0
&& s.endsWith(".class")){
list.add(entry.getName()
.replaceAll("\\.class$","")
.replaceAll("/","."));
}
}
}else if(url.getProtocol().equals("file")){
String pname = target.replaceAll("/",".");
File f = new File(url.toURI());
String fary = f.list(new FilenameFilterImpl("^\\w+.class$"));
for(String fname : fary){
list.add(pname+fname.replaceAll("\\.class$",""));
}
}
}catch(Exception e){
}
return list.toArray(new String{});
}
}
===========================================-
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
/**
* ファイル名フィルタ.
* java.io.File#list(FilenameFilter) を実行するための実装クラス
* (例)
* File f = new File("c:/tmp");
* // f のディレクトリで CSVファイル名を検索
* String[] fnames = f.list(new FilenameFilterImpl("^.*\\.csv$"));
*/
public class FilenameFilterImpl implements FilenameFilter{
private Pattern pattern;
/**
* コンストラクタ.
* @param pattern java.util.regex.Pattern#compileを生成するための文字列
*/
public FilenameFilterImpl(String pattern){
this.pattern = Pattern.compile(pattern);
}
/***
* java.io.FilenameFilter#accept(java.io.File,java.lang.String)の実装
* @param dir ディレクトリを指すFile
* @param name ファイル名、java.util.regex.Pattern#matcherを実行するための文字列
* @return true=ファイルリストに含める
*/
public boolean accept(File dir,String name){
File f = new File(dir.getPath()+File.separator+name);
if (f.isDirectory()) return false; // ディレクトリは除く
return this.pattern.matcher(name).matches();
}
}