{"record":{"id":"d08d9b71832ea7f2","repo":"Blankj/AndroidUtilCode","slug":"u-can-t-instantiate-me-d08d9b","errorCode":null,"errorMessage":"u can't instantiate me...","messagePattern":"u can't instantiate me\\.\\.\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"lib/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java","lineNumber":44,"sourceCode":"import java.util.Set;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.RequiresPermission;\n\nimport static android.Manifest.permission.KILL_BACKGROUND_PROCESSES;\n\n/**\n * <pre>\n *     author: Blankj\n *     blog  : http://blankj.com\n *     time  : 2016/10/18\n *     desc  : utils about process\n * </pre>\n */\npublic final class ProcessUtils {\n\n    private ProcessUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * Return the foreground process name.\n     * <p>Target APIs greater than 21 must hold\n     * {@code <uses-permission android:name=\"android.permission.PACKAGE_USAGE_STATS\" />}</p>\n     *\n     * @return the foreground process name\n     */\n    public static String getForegroundProcessName() {\n        ActivityManager am =\n                (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);\n        //noinspection ConstantConditions\n        List<ActivityManager.RunningAppProcessInfo> pInfo = am.getRunningAppProcesses();\n        if (pInfo != null && pInfo.size() > 0) {\n            for (ActivityManager.RunningAppProcessInfo aInfo : pInfo) {\n                if (aInfo.importance\n                        == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/Blankj/AndroidUtilCode/blob/7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809/lib/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java#L26-L62","documentation":"ProcessUtils is a final utility class providing static methods for process information (getForegroundProcessName, getCurrentProcessName, killBackgroundProcesses, etc.). Its private constructor throws UnsupportedOperationException to enforce static-only access.","triggerScenarios":"Direct or reflective instantiation by DI frameworks, mocking libraries, serialization frameworks, or manual reflection.","commonSituations":"DI component scanning traverses the utility package; a test framework instantiates all classes; a serialization library targets the class.","solutions":["Use static methods: ProcessUtils.getCurrentProcessName(), ProcessUtils.getForegroundProcessName(). Never call new ProcessUtils().","Exclude utility classes from DI scanning and serialization configs.","Mock static methods with mockito-inline for testing."],"exampleFix":"// before\nProcessUtils pu = new ProcessUtils();\nString name = pu.getCurrentProcessName();\n\n// after\nString name = ProcessUtils.getCurrentProcessName();","handlingStrategy":"type-guard","validationCode":"// ProcessUtils is static-only\nString procName = ProcessUtils.getCurrentProcessName();\nString fgName = ProcessUtils.getForegroundProcessName();","typeGuard":"static boolean isStaticUtility(Class<?> c) {\n    return Modifier.isFinal(c.getModifiers()) && c.getSimpleName().endsWith(\"Utils\");\n}","tryCatchPattern":"try {\n    ProcessUtils.class.getDeclaredConstructor().setAccessible(true);\n    ProcessUtils.class.getDeclaredConstructor().newInstance();\n} catch (UnsupportedOperationException e) {\n    // Use static methods\n}","preventionTips":["Never instantiate classes ending in 'Utils'.","Exclude util packages from DI and serialization scanning.","Use ProcessUtils.getCurrentProcessName(), etc. statically."],"tags":["java","android","utility-class","instantiation","process"],"backgroundTag":null,"analyzedSha":"7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809","analyzedAt":"2026-08-14T02:26:54.956Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}