Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /*
  * Copyright (C) 2013 Samuel Halliday
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see [http://www.gnu.org/licenses/].
 */
package com.github.fommil.netlib.generator;
import static com.google.common.collect.Lists.newArrayList;
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;

Scans jar files for methods.

SIDE-EFFECT WARNING: discovered classes are loaded (only point at trusted jars, as arbitrary code may be invoked).

Author(s):
Sam Halliday
public class JarMethodScanner {
    @NonNull
    private final File file;
    private URLClassLoader createLoader() {
        try {
            URL url = .toURI().toURL();
            return new URLClassLoader(new URL[]{url});
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException(e);
        }
    }
    private List<StringgetClasses(String packageNamethrows IOException {
        @Cleanup JarFile jar = new JarFile();
        List<Stringmatched = newArrayList();
        for (Enumeration<JarEntryentries = jar.entries(); entries.hasMoreElements(); ) {
            String entryName = entries.nextElement().getName();
            if (entryName.startsWith(packageName.replace(".""/")) && entryName.endsWith(".class"))
                matched.add(entryName.replace(".class""").replace("/""."));
        }
        return matched;
    }
    public List<MethodgetStaticMethods(String packageNamethrows Exception {
        List<Methodmethods = newArrayList();
        List<StringclassNames = getClasses(packageName);
        URLClassLoader loader = createLoader();
        for (String className : classNames) {
            Class<?> clazz = loader.loadClass(className);
            for (Method method : clazz.getMethods()) {
                int modifiers = method.getModifiers();
                String fqn = method.getDeclaringClass().getCanonicalName();
                if (isStatic(modifiers) && isPublic(modifiers) && fqn.startsWith(packageName))
                    methods.add(method);
            }
        }
        return methods;
    }
New to GrepCode? Check out our FAQ X