Calling a method in a class by reflection
//Apply for permission
@AfterPermissionGranted(REQUEST_CODE_QRCODE_PERMISSIONS)
private void requestCodeQRCodePermissions() {
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
}
/**
*1, convenience class, determine whether the method has the AfterPermissionGranted tag
*2, if there is a label, and requestCode and value are desired, then modify the method access permission
*3, call the object method method.invoke(object);
*/
private static void runAnnotatedMethods(Object object, int requestCode) {
Class clazz = object. getClass();
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(AfterPermissionGranted.class)) {
// Check for annotated methods with matching request code.
AfterPermissionGranted ann = method.getAnnotation(AfterPermissionGranted.class);
if (ann.value() == requestCode) {
// Method must be void so that we can invoke it
if (method.getParameterTypes().length > 0) {
throw new RuntimeException(
"Cannot execute non-void method " + method.getName());
}
try {
// Make method accessible if private(修改为可访问)
if (!method.isAccessible()) {
method.setAccessible(true);
}
method.invoke(object);
} catch (IllegalAccessException e) {
Log.e(TAG, "runDefaultMethod:IllegalAccessException", e);
} catch (InvocationTargetException e) {
Log.e(TAG, "runDefaultMethod:InvocationTargetException", e);
}
}
}
}
}
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=326227439&siteId=291194637
Recommended
Ranking