Last active
January 7, 2017 05:43
-
-
Save afshin-hoseini/b301d7d9f6db1e9d09da6ed0f7870fdc to your computer and use it in GitHub Desktop.
Finding all classes available in an android application.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//To list all methods in android application | |
public void listAllClasses() { | |
try { | |
DexFile df = new DexFile(getPackageCodePath()); | |
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) { | |
String classPath = iter.nextElement(); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
//To get generic types defined in a an object initilization | |
/* | |
//Assume we have some object definition like this: | |
CallbackListener callbacklistener = new CallbackListener<SomeController.Response>(); | |
//We have to do this in order to get type of generic type defined in | |
Class responseType = (Class<? extends Response>) ((ParameterizedType) callbackListener.getClass().getGenericSuperclass()) | |
.getActualTypeArguments()[0]; | |
*/ | |
//To find all classes of a specific type | |
public static Set<Class> getClassesOfType(@NonNull Class typeOfClass, @NonNull String inPackageName, @NonNull Context context, boolean onlyIncludeSubclasses) { | |
Set<Class> classes = new HashSet<>(); | |
try { | |
DexFile df = new DexFile(context.getPackageCodePath()); | |
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) { | |
String classPath = iter.nextElement(); | |
if(classPath.startsWith(inPackageName)) { | |
Class main = Class.forName(classPath); | |
Class c = main; | |
do { | |
if(c.getName().equals(typeOfClass.getName())) { | |
if(onlyIncludeSubclasses && c == main) | |
break; | |
classes.add(main); | |
break; | |
} | |
c = c.getSuperclass(); | |
} while ( c != null); | |
} | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return classes; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment