何をするものか? †
- 最終目的は、JDBCドライバに含まれる java.sql.Driver インタフェースを実装したクラス名を知ること。
- その練習として、Jarファイルに含まれるクラス名を列挙するアプリケーションを作ってみる
アルゴリズム †
- Jarファイルに含まれるファイルのファイル名をクラス名と見なす。
たとえば、com/mysql/jdbc/Driver.class を com.mysql.jdbc.Driver と見なす。
- Jarファイルを URLClassloader に設定して、URLClassloader を使って 1. で見つけたクラスを load する。
- 2. で load したクラスのインタフェースを列挙する。
ソースコード †
package com.snail.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
public class JarContentsAnalyzer {
public static void main(String[] args) {
try {
File jarFile = new File("mysql-connector-java-5.1.5-bin.jar");
ClassLoader parent = ClassLoader.getSystemClassLoader();
URLClassLoader urlClazzloader = new URLClassLoader(new URL[] {
jarFile.toURI().toURL()
}, parent);
JarInputStream jarIn = new JarInputStream(new FileInputStream(jarFile));
JarEntry entry;
while ((entry = jarIn.getNextJarEntry()) != null) {
if (!entry.isDirectory()) {
String fileName = entry.getName();
String clazzName = fileName2className(fileName);
try {
Class<?> clazz = urlClazzloader.loadClass(clazzName);
System.out.println(clazz.getName());
for (Class<?> inf : clazz.getInterfaces()) {
System.out.println(" <" + inf.getName() + ">");
}
} catch (Throwable th) {
th = null;
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String fileName2className(String fileName) {
int dot = fileName.lastIndexOf(".");
if (dot > 0) {
return fileName.substring(0, dot).replaceAll("/", ".");
}
return fileName;
}
}
実行結果 †
com.mysql.jdbc.AssertionFailedException
com.mysql.jdbc.Blob
<java.sql.Blob>
<com.mysql.jdbc.OutputStreamWatcher>
com.mysql.jdbc.BlobFromLocator$LocatorInputStream
com.mysql.jdbc.BlobFromLocator
<java.sql.Blob>
com.mysql.jdbc.Buffer
com.mysql.jdbc.BufferRow
com.mysql.jdbc.ByteArrayRow
com.mysql.jdbc.CachedResultSetMetaData
com.mysql.jdbc.CallableStatement$CallableStatementParam
com.mysql.jdbc.CallableStatement$CallableStatementParamInfo
com.mysql.jdbc.CallableStatement$CallableStatementParamInfoJDBC3
<java.sql.ParameterMetaData>
com.mysql.jdbc.CallableStatement
<java.sql.CallableStatement>
com.mysql.jdbc.CharsetMapping
…(中略)…
com.mysql.jdbc.DatabaseMetaData$1
com.mysql.jdbc.DatabaseMetaData$2
com.mysql.jdbc.DatabaseMetaData$3
com.mysql.jdbc.DatabaseMetaData$4
com.mysql.jdbc.DatabaseMetaData$5
com.mysql.jdbc.DatabaseMetaData$6
com.mysql.jdbc.DatabaseMetaData$7
com.mysql.jdbc.DatabaseMetaData$8
com.mysql.jdbc.DatabaseMetaData$9
com.mysql.jdbc.DatabaseMetaData$IteratorWithCleanup
com.mysql.jdbc.DatabaseMetaData$LocalAndReferencedColumns
com.mysql.jdbc.DatabaseMetaData$ResultSetIterator
com.mysql.jdbc.DatabaseMetaData$SingleStringIterator
com.mysql.jdbc.DatabaseMetaData$TypeDescriptor
com.mysql.jdbc.DatabaseMetaData
<java.sql.DatabaseMetaData>
com.mysql.jdbc.DatabaseMetaDataUsingInfoSchema
com.mysql.jdbc.DocsConnectionPropsHelper
com.mysql.jdbc.Driver
<java.sql.Driver>
com.mysql.jdbc.EscapeProcessor
com.mysql.jdbc.EscapeProcessorResult
…(中略)…
com.mysql.jdbc.util.ServerController
com.mysql.jdbc.util.TimezoneDump
com.mysql.jdbc.util.VersionFSHierarchyMaker
org.gjt.mm.mysql.Driver
Java#JavaSE