要查看jar文件中嵌入的.class文件中的方法可能吗 ?

时间:2013-08-22 07:15:50

标签: java class methods jar

我有一个包含这么多* .class文件的jar文件。我需要在类文件中搜索一个方法(我现在只有我的方法名称)。

有可能吗?

4 个答案:

答案 0 :(得分:17)

从jar文件中提取类,然后运行

unzip Classes.jar
find . -name '*.class' | xargs javap -p > classes.txt

classes.txt文件将包含有关jar内部类的所有信息。您可以在其中搜索方法。

答案 1 :(得分:2)

您可以在method declaration中看到Eclipse IDE [但不是源代码]。 打开Package Explorer --> Referenced libraries [在项目中引用]然后展开要查看类的jar的树。 在outline窗口中,您可以看到方法声明

答案 2 :(得分:2)

您可以在winzip / winrar中打开jar并将类文件反编译为java文件。 网上有多个反编译器

答案 3 :(得分:2)

您可以使用以下步骤在Jar文件中查找包含目标方法名称的所有类名。

  1. 获取指定Jar文件的条目。
  2. 检查每个JarEntry的名称。如果名称以'.class'结尾。然后填充类名。
  3. 使用填充的类名称通过反射获取所有方法。
  4. 比较名称和目标方法名称。如果它们相等,则在控制台中打印方法名称和类名。
  5. 使用上述步骤,我们可以在jar文件中找到具有指定目标方法名称的所有类名。

    我编写了一个代码并运行了一个示例,用于在jar“ commons-lang-2.4.jar ”中找到类名,目标方法名称为“ removeCauseMethodName ”。

    以下消息显示在控制台中。

    方法[removeCauseMethodName]包含在Class [org.apache.commons.lang.exception.ExceptionUtils]

    从消息中,我们可以看到类名,其中包括目标方法名称。

    代码如下:

    注意:在运行代码之前,我们需要将jar'commons-lang-2.4.jar'添加到构建路径。

    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.util.Enumeration;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    
    public class SearchMetodInJarFile {
    
        private static final String CLASS_SUFFIX = ".class";
    
        public static void main(String[] args) throws IOException,
                SecurityException, ClassNotFoundException {
    
            /** target method name to be searched */
            String targetMethodClass = "removeCauseMethodName";
    
            /**
             * Specify a target method name as 'removeCauseMethodName'. Find class
             * name that includes the target method name in Jar File.
             */
            new SearchMetodInJarFile().searchMethodName(new JarFile(
                    "D:\\Develop\\workspace\\Test\\commons-lang-2.4.jar"),
                    targetMethodClass);
    
        }
    
        /**
         * Search target method name in multiple Jar files.
         */
        public void searchMethodName(JarFile[] jarFiles, String targetMethodName)
                throws SecurityException, ClassNotFoundException {
    
            for (JarFile jarFile : jarFiles) {
                searchMethodName(jarFile, targetMethodName);
            }
        }
    
        /**
         * Search target method name in one Jar file.
         */
        public void searchMethodName(JarFile jarFile, String targetMethodName)
                throws SecurityException, ClassNotFoundException {
            Enumeration<JarEntry> entryEnum = jarFile.entries();
            while (entryEnum.hasMoreElements()) {
                doSearchMethodName(entryEnum.nextElement(), targetMethodName);
            }
        }
    
        /**
         * Check the name of JarEntry, if its name ends with '.class'. Then do the
         * following 3 steps: 1. Populate Class name. 2. Get the methods by
         * reflection. 3. Compare the target method name with the names. If the
         * methood name is equal to target method name. Then print the method name
         * and class name in console.
         */
        private void doSearchMethodName(JarEntry entry, String targetMethodName)
                throws SecurityException, ClassNotFoundException {
            String name = entry.getName();
            if (name.endsWith(CLASS_SUFFIX)) {
                /**
                 * Populate the class name
                 */
                name = name.replaceAll("/", ".")
                        .substring(0, name.lastIndexOf("."));
    
                /**
                 * Retrieve the methods via reflection.
                 */
                Method[] methods = Class.forName(name).getDeclaredMethods();
                for (Method m : methods) {
                    /**
                     * Print the message in console if the method name is expected.
                     */
                    if (targetMethodName.equals(m.getName())) {
                        System.out.println(String.format(
                                "Method [%s] is included in Class [%s]",
                                targetMethodName, name));
                        break;
                    }
                }
    
            }
        }
    }
    

    希望这可以帮到你一些。