如何从java 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

我在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.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,而不会执行任何操作