从外部Java.jar文件获取方法

从外部Java.jar文件获取方法,java,jar,Java,Jar,我试图检索外部java.jar文件中的方法列表。这个外部jar不会包含在我的构建路径中,我需要通过在外部代码中引用它来完全获取信息。用例是在.jar中搜索不推荐的方法,这些方法已加载到我使用的应用程序中 我已经在网上找到了一些解决方案并应用了它们,但是它们都希望java或者buildpath能够提供一些本地的解决方案。我只能提供一个文件/文件路径作为参数,并基于此派生所有内容 我现在的代码如下,我正在寻找如何以我需要的方式使用它的解决方案。任何帮助都将不胜感激 public static voi

我试图检索外部java.jar文件中的方法列表。这个外部jar不会包含在我的构建路径中,我需要通过在外部代码中引用它来完全获取信息。用例是在.jar中搜索不推荐的方法,这些方法已加载到我使用的应用程序中

我已经在网上找到了一些解决方案并应用了它们,但是它们都希望java或者buildpath能够提供一些本地的解决方案。我只能提供一个文件/文件路径作为参数,并基于此派生所有内容

我现在的代码如下,我正在寻找如何以我需要的方式使用它的解决方案。任何帮助都将不胜感激

public static void main(String[] args) throws IOException {

    Collection<Class<?>> classes = new ArrayList<Class<?>>();

    JarFile jar = new JarFile("C:\\app\\folder\\jar\\file.jar");

    for (Enumeration<JarEntry> entries = jar.entries(); entries.hasMoreElements(); )
    {
        JarEntry entry = entries.nextElement();
        String file = entry.getName();

        if (file.endsWith(".class"))
        {

            String classname = file.replace('/','.').substring(0, file.length()-6);
        System.out.println(classname);

            try {
                Class<?> c = Class.forName(classname);
                classes.add(c);
            } catch (Throwable e) {
                System.out.println("WARNING: failed to instantiate " + classname + " from " + file);
            }
        }
    }
    for (Class<?> c: classes) 
        System.out.println(c);
}
publicstaticvoidmain(字符串[]args)引发IOException{
收藏>();
JarFile jar=newjarfile(“C:\\app\\folder\\jar\\file.jar”);
for(枚举条目=jar.entries();entries.hasMoreElements();)
{
JarEntry=entries.nextElement();
String file=entry.getName();
if(file.endsWith(“.class”))
{
字符串classname=file.replace('/','.').substring(0,file.length()-6);
System.out.println(类名);
试一试{
类别c=类别forName(类别名称);
增加(c);
}捕获(可丢弃的e){
System.out.println(“警告:未能从“+文件”实例化“+类名+”);
}
}
}
用于(c类:类)
系统输出打印ln(c);
}

您可以使用外部jar文件构造一个
URLClassLoader
,并使用它来加载在jar中发现的类。当您有一个类对象时,您可以调用
getMethods()
getDeclaredMethods()
来获取类的私有、受保护和公共方法

public static void main(String[] args) throws Exception {
        Set<Class<?>> classes = new HashSet<>();

        URL jarUrl = new URL("file:///C:/app/folder/jar/file.jar");
        URLClassLoader loader = new URLClassLoader(new URL[]{jarUrl});
        JarFile jar = new JarFile("C:\\app\\folder\\jar\\file.jar");

        for (Enumeration<JarEntry> entries = jar.entries(); entries.hasMoreElements(); )
        {
            JarEntry entry = entries.nextElement();
            String file = entry.getName();

            if (file.endsWith(".class"))
            {

                String classname =
                        file.replace('/', '.').substring(0, file.length() - 6).split("\\$")[0];
//                System.out.println(classname);

                try {
                    Class<?> c = loader.loadClass(classname);
                    classes.add(c);
                } catch (Throwable e) {
                    System.out.println("WARNING: failed to instantiate " + classname + " from " + file);
                }
            }
        }
        Map<String, List<Method>> collected =
                classes.stream().collect(Collectors.toMap(Class::getName, clz -> {
                    List<Method> methods = new ArrayList<>(Arrays.asList(clz.getDeclaredMethods()));
                    methods.addAll(Arrays.asList(clz.getMethods()));
                    return methods;
                }));

        collected.forEach((clz, methods) -> System.out.println("\n" + clz + "\n\n" + methods));
    }
publicstaticvoidmain(字符串[]args)引发异常{
设置c=loader.loadClass(类名);
增加(c);
}捕获(可丢弃的e){
System.out.println(“警告:未能从“+文件”实例化“+类名+”);
}
}
}
收集的地图=
classes.stream().collect(Collectors.toMap)(Class::getName,clz->{
列表方法=新的ArrayList(Arrays.asList(clz.getDeclaredMethods());
addAll(Arrays.asList(clz.getMethods());
返回方法;
}));
collected.forEach((clz,methods)->System.out.println(“\n”+clz+“\n\n”+methods));
}

您可以使用外部jar文件构造一个
URLClassLoader
,并使用它来加载在jar中发现的类。当您有一个类对象时,您可以调用
getMethods()
getDeclaredMethods()
来获取类的私有、受保护和公共方法

public static void main(String[] args) throws Exception {
        Set<Class<?>> classes = new HashSet<>();

        URL jarUrl = new URL("file:///C:/app/folder/jar/file.jar");
        URLClassLoader loader = new URLClassLoader(new URL[]{jarUrl});
        JarFile jar = new JarFile("C:\\app\\folder\\jar\\file.jar");

        for (Enumeration<JarEntry> entries = jar.entries(); entries.hasMoreElements(); )
        {
            JarEntry entry = entries.nextElement();
            String file = entry.getName();

            if (file.endsWith(".class"))
            {

                String classname =
                        file.replace('/', '.').substring(0, file.length() - 6).split("\\$")[0];
//                System.out.println(classname);

                try {
                    Class<?> c = loader.loadClass(classname);
                    classes.add(c);
                } catch (Throwable e) {
                    System.out.println("WARNING: failed to instantiate " + classname + " from " + file);
                }
            }
        }
        Map<String, List<Method>> collected =
                classes.stream().collect(Collectors.toMap(Class::getName, clz -> {
                    List<Method> methods = new ArrayList<>(Arrays.asList(clz.getDeclaredMethods()));
                    methods.addAll(Arrays.asList(clz.getMethods()));
                    return methods;
                }));

        collected.forEach((clz, methods) -> System.out.println("\n" + clz + "\n\n" + methods));
    }
publicstaticvoidmain(字符串[]args)引发异常{
设置c=loader.loadClass(类名);
增加(c);
}捕获(可丢弃的e){
System.out.println(“警告:未能从“+文件”实例化“+类名+”);
}
}
}
收集的地图=
classes.stream().collect(Collectors.toMap)(Class::getName,clz->{
列表方法=新的ArrayList(Arrays.asList(clz.getDeclaredMethods());
addAll(Arrays.asList(clz.getMethods());
返回方法;
}));
collected.forEach((clz,methods)->System.out.println(“\n”+clz+“\n\n”+methods));
}

首先,您需要确定是否要使用JVM加载的类或数组中的字节码。这两种方法有很大的不同。您是否在寻找
java.util.ServiceLoader
?首先,您需要弄清楚是要使用JVM加载的类还是数组中的字节码。这两种方法截然不同。您正在寻找
java.util.ServiceLoader