如何从java jar文件打印类和接口名称
我在java中有一个Jar,它包含2个类和1个接口。如何从jar中获取接口和类名。目前我可以得到类名,但不能得到接口名如何从java jar文件打印类和接口名称,java,Java,我在java中有一个Jar,它包含2个类和1个接口。如何从jar中获取接口和类名。目前我可以得到类名,但不能得到接口名 List jClasses = getClasseNames("D://Test.jar"); System.out.println(jClasses.size()); for (int i = 0; i < jClasses.size(); i++) { System.out.p
List jClasses = getClasseNames("D://Test.jar");
System.out.println(jClasses.size());
for (int i = 0; i < jClasses.size(); i++) {
System.out.println("Print Classes ::" + jClasses.get(i));
if(( null != jClasses.getClass().getInterfaces()[i])) {
System.out.println(jClasses.getClass().getInterfaces()[i]);
} else {
System.out.println("No connection");
}
}
public static List getClasseNames(String jarName) {
ArrayList classes = new ArrayList();
try {
JarInputStream jarFile = new JarInputStream(new FileInputStream(
jarName));
JarEntry jarEntry;
while (true) {
jarEntry = jarFile.getNextJarEntry();
if (jarEntry == null) {
break;
}
if (jarEntry.getName().endsWith(".class")) {
classes.add(jarEntry.getName().replaceAll("/", "\\."));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return classes;
}
请建议。您可以使用此类:
package io.github.gabrielbb.java.utilities;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
/**
* @author Gabriel Basilio Brito
* @since 12/26/2016
* @version 1.1
*/
public class ClassesAndInterfacesFromJar {
public static List<Class> getJarClasses(String jarPath) throws IOException, ClassNotFoundException {
File jarFile = new File(jarPath);
return getJarClasses(jarFile);
}
public static List<Class> getJarClasses(File jar) throws IOException, ClassNotFoundException {
ArrayList<Class> classes = new ArrayList();
JarInputStream jarInputStream = null;
URLClassLoader cl;
try {
cl = URLClassLoader.newInstance(new URL[]{new URL("jar:file:" + jar + "!/")}); // To load classes inside the jar, after getting their names
jarInputStream = new JarInputStream(new FileInputStream(
jar)); // Getting a JarInputStream to iterate through the Jar files
JarEntry jarEntry = jarInputStream.getNextJarEntry();
while (jarEntry != null) {
if (jarEntry.getName().endsWith(".class")) { // Avoiding non ".class" files
String className = jarEntry.getName().replaceAll("/", "\\."); // The ClassLoader works with "." instead of "/"
className = className.substring(0, jarEntry.getName().length() - 6); // Removing ".class" from the string
Class clazz = cl.loadClass(className); // Loading the class by its name
classes.add(clazz);
}
jarEntry = jarInputStream.getNextJarEntry(); // Next File
}
} finally {
if (jarInputStream != null) {
jarInputStream.close(); // Closes the FileInputStream
}
}
return classes;
}
// Main Method for testing purposes
public static void main(String[] args) {
try {
String jarPath = "C://Test.jar";
List<Class> classes = getJarClasses(jarPath);
for (Class c : classes) {
// Here we can use the "isInterface" method to differentiate an Interface from a Class
System.out.println(c.isInterface() ? "Interface: " + c.getName() : "Class: " + c.getName());
}
} catch (Exception ex) {
System.err.println(ex);
}
}
包io.github.gabrielbb.java.utilities;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.net.URL;
导入java.net.URLClassLoader;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.jar.JarEntry;
导入java.util.jar.JarInputStream;
/**
*@作者加布里埃尔·巴西里奥·布里托
*@自2016年12月26日起
*@version 1.1
*/
来自JAR的公共类类和接口{
公共静态列表getJarClasses(字符串jarPath)引发IOException、ClassNotFoundException{
文件jarFile=新文件(jarPath);
返回getJarClasses(jarFile);
}
公共静态列表getJarClasses(文件jar)抛出IOException、ClassNotFoundException{
ArrayList类=新的ArrayList();
JarInputStream JarInputStream=null;
URLClassLoader cl;
试一试{
cl=URLClassLoader.newInstance(新URL[]{newURL(“jar:file:“+jar+”!/”)});//在获取类的名称后在jar中加载类
jarInputStream=新的jarInputStream(新文件InputStream(
jar));//获取一个JarInputStream来遍历jar文件
JarEntry JarEntry=jarInputStream.getNextJarEntry();
while(jarEntry!=null){
if(jarEntry.getName().endsWith(“.class”){//避免非“.class”文件
String className=jarEntry.getName().replaceAll(“/”,“\\”);//类加载器使用“.”而不是“/”
className=className.substring(0,jarEntry.getName().length()-6);//从字符串中删除“.class”
Class clazz=cl.loadClass(className);//按名称加载类
添加(clazz);
}
jarEntry=jarInputStream.getNextJarEntry();//下一个文件
}
}最后{
if(jarInputStream!=null){
jarInputStream.close();//关闭文件InputStream
}
}
返回类;
}
//用于测试目的的主要方法
公共静态void main(字符串[]args){
试一试{
字符串jarPath=“C://Test.jar”;
列表类=getJarClasses(jarPath);
用于(c类:类){
//在这里,我们可以使用“isInterface”方法来区分接口和类
System.out.println(c.isInterface()?“接口:”+c.getName():“类:”+c.getName());
}
}捕获(例外情况除外){
系统错误打印项次(ex);
}
}
可在以下网址找到:
您可以使用该类:
package io.github.gabrielbb.java.utilities;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
/**
* @author Gabriel Basilio Brito
* @since 12/26/2016
* @version 1.1
*/
public class ClassesAndInterfacesFromJar {
public static List<Class> getJarClasses(String jarPath) throws IOException, ClassNotFoundException {
File jarFile = new File(jarPath);
return getJarClasses(jarFile);
}
public static List<Class> getJarClasses(File jar) throws IOException, ClassNotFoundException {
ArrayList<Class> classes = new ArrayList();
JarInputStream jarInputStream = null;
URLClassLoader cl;
try {
cl = URLClassLoader.newInstance(new URL[]{new URL("jar:file:" + jar + "!/")}); // To load classes inside the jar, after getting their names
jarInputStream = new JarInputStream(new FileInputStream(
jar)); // Getting a JarInputStream to iterate through the Jar files
JarEntry jarEntry = jarInputStream.getNextJarEntry();
while (jarEntry != null) {
if (jarEntry.getName().endsWith(".class")) { // Avoiding non ".class" files
String className = jarEntry.getName().replaceAll("/", "\\."); // The ClassLoader works with "." instead of "/"
className = className.substring(0, jarEntry.getName().length() - 6); // Removing ".class" from the string
Class clazz = cl.loadClass(className); // Loading the class by its name
classes.add(clazz);
}
jarEntry = jarInputStream.getNextJarEntry(); // Next File
}
} finally {
if (jarInputStream != null) {
jarInputStream.close(); // Closes the FileInputStream
}
}
return classes;
}
// Main Method for testing purposes
public static void main(String[] args) {
try {
String jarPath = "C://Test.jar";
List<Class> classes = getJarClasses(jarPath);
for (Class c : classes) {
// Here we can use the "isInterface" method to differentiate an Interface from a Class
System.out.println(c.isInterface() ? "Interface: " + c.getName() : "Class: " + c.getName());
}
} catch (Exception ex) {
System.err.println(ex);
}
}
包io.github.gabrielbb.java.utilities;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.net.URL;
导入java.net.URLClassLoader;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.jar.JarEntry;
导入java.util.jar.JarInputStream;
/**
*@作者加布里埃尔·巴西里奥·布里托
*@自2016年12月26日起
*@version 1.1
*/
来自JAR的公共类类和接口{
公共静态列表getJarClasses(字符串jarPath)引发IOException、ClassNotFoundException{
文件jarFile=新文件(jarPath);
返回getJarClasses(jarFile);
}
公共静态列表getJarClasses(文件jar)抛出IOException、ClassNotFoundException{
ArrayList类=新的ArrayList();
JarInputStream JarInputStream=null;
URLClassLoader cl;
试一试{
cl=URLClassLoader.newInstance(新URL[]{newURL(“jar:file:“+jar+”!/”)});//在获取类的名称后在jar中加载类
jarInputStream=新的jarInputStream(新文件InputStream(
jar));//获取一个JarInputStream来遍历jar文件
JarEntry JarEntry=jarInputStream.getNextJarEntry();
while(jarEntry!=null){
if(jarEntry.getName().endsWith(“.class”){//避免非“.class”文件
String className=jarEntry.getName().replaceAll(“/”,“\\”);//类加载器使用“.”而不是“/”
className=className.substring(0,jarEntry.getName().length()-6);//从字符串中删除“.class”
Class clazz=cl.loadClass(className);//按名称加载类
添加(clazz);
}
jarEntry=jarInputStream.getNextJarEntry();//下一个文件
}
}最后{
if(jarInputStream!=null){
jarInputStream.close();//关闭文件InputStream
}
}
返回类;
}
//用于测试目的的主要方法
公共静态void main(字符串[]args){
试一试{
字符串jarPath=“C://Test.jar”;
列表类=getJarClasses(jarPath);
用于(c类:类){
//在这里,我们可以使用“isInterface”方法来区分接口和类
System.out.println(c.isInterface()?“接口:”+c.getName():“类:”+c.getName());
}
}捕获(例外情况除外){
系统错误打印项次(ex);
}
}
可在以下网址找到:
什么是
getClasseNames
而这个jclass.getClass().getInterfaces()[i]
是可疑的,jclass.get(i).getClass().getInterfaces()
可能getClasseNames
实际上包含在发布的代码中。@词典库不是这样的:您应该真正避免使用原始类型。这样会自动记录代码。jClasses
是一个列表。对其调用getClass()会返回List.class,而不会执行任何操作