{"id":13838639,"url":"https://github.com/mstrobel/procyon","last_synced_at":"2025-10-21T04:53:45.330Z","repository":{"id":37976480,"uuid":"217891090","full_name":"mstrobel/procyon","owner":"mstrobel","description":"Procyon is a suite of Java metaprogramming tools, including a rich reflection API, a LINQ-inspired expression tree API for runtime code generation, and a Java decompiler.","archived":false,"fork":false,"pushed_at":"2022-06-12T17:09:04.000Z","size":33836,"stargazers_count":1136,"open_issues_count":56,"forks_count":131,"subscribers_count":24,"default_branch":"develop","last_synced_at":"2025-10-13T20:39:04.568Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mstrobel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License.Rtf","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-27T17:31:03.000Z","updated_at":"2025-10-07T00:14:59.000Z","dependencies_parsed_at":"2022-07-11T21:18:01.419Z","dependency_job_id":null,"html_url":"https://github.com/mstrobel/procyon","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/mstrobel/procyon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstrobel%2Fprocyon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstrobel%2Fprocyon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstrobel%2Fprocyon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstrobel%2Fprocyon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mstrobel","download_url":"https://codeload.github.com/mstrobel/procyon/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mstrobel%2Fprocyon/sbom","scorecard":{"id":666211,"data":{"date":"2025-08-11","repo":{"name":"github.com/mstrobel/procyon","commit":"88a95fa93c58322393174f84543edc7a0a2ca44d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/gradle-wrapper-validation.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: License.html:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/gradle-wrapper-validation.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/mstrobel/procyon/gradle-wrapper-validation.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/gradle-wrapper-validation.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/mstrobel/procyon/gradle-wrapper-validation.yml/develop?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.6.0 not signed: https://api.github.com/repos/mstrobel/procyon/releases/60078653","Warn: release artifact 0.6-prerelease not signed: https://api.github.com/repos/mstrobel/procyon/releases/44907652","Warn: release artifact v0.6.0 does not have provenance: https://api.github.com/repos/mstrobel/procyon/releases/60078653","Warn: release artifact 0.6-prerelease does not have provenance: https://api.github.com/repos/mstrobel/procyon/releases/44907652"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-21T18:07:49.451Z","repository_id":37976480,"created_at":"2025-08-21T18:07:49.451Z","updated_at":"2025-08-21T18:07:49.451Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280207194,"owners_count":26290616,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T16:00:25.698Z","updated_at":"2025-10-21T04:53:45.302Z","avatar_url":"https://github.com/mstrobel.png","language":"Java","readme":"![](https://mstrobel.github.io/procyon/procyon.png)\r\n\r\n*Procyon* is a suite of Java metaprogramming tools focused on code generation and analysis.  It includes the following libraries:\r\n\r\n  1. Core Framework\r\n  2. [Reflection Framework](https://github.com/mstrobel/procyon/wiki/Reflection-Framework)\r\n  3. [Expressions Framework](https://github.com/mstrobel/procyon/wiki/Expressions-Framework)\r\n  4. Compiler Toolset (Experimental)\r\n  5. [Java Decompiler](https://github.com/mstrobel/procyon/wiki/Java-Decompiler) (Experimental)\r\n\r\nThe Procyon libraries are available from **Maven Central** under group ID `org.bitbucket.mstrobel`.\r\n\r\n### Core Framework\r\n\r\nThe `procyon-core` framework contains common support classes used by the other Procyon APIs.  Its facilities include string manipulation, collection extensions, filesystem/path utilities, freezable objects and collections, attached data stores, and some runtime type helpers.\r\n\r\n### Reflection Framework\r\nThe `procyon-reflection` framework provides a rich reflection and code generation API with full support for generics, wildcards, and other high-level Java type concepts.  It is based on .NET's `System.Reflection` and `System.Reflection.Emit` APIs and is meant to address many of the shortcomings of the core Java reflection API, which offers rather limited and cumbersome support for generic type inspection.  Its code generation facilities include a `TypeBuilder`, `MethodBuilder`, and a bytecode emitter.\r\n\r\nFor more information, see the [Reflection Framework](https://github.com/mstrobel/procyon/wiki/Reflection-Framework) topic.\r\n\r\n#### Example\r\n\r\n```java\r\nfinal Type\u003cMap\u003e map = Type.of(Map.class);\r\nfinal Type\u003c?\u003e rawMap = map.getErasedType();\r\nfinal Type\u003cMap\u003cString, Integer\u003e\u003e boundMap = map.makeGenericType(Types.String, Types.Integer);\r\n\r\nSystem.out.println(map.getDeclaredMethods().get(1));\r\nSystem.out.println(rawMap.getDeclaredMethods().get(1));\r\nSystem.out.println(boundMap.getDeclaredMethods().get(1));\r\n\r\nSystem.out.println(boundMap.getGenericTypeParameters());\r\nSystem.out.println(boundMap.getTypeArguments());\r\n```\r\n\r\n#### Output\r\n\r\n```text\r\npublic abstract V put(K, V)\r\npublic abstract Object put(Object, Object)\r\npublic abstract Integer put(String, Integer)\r\n[K, V]\r\n[java.lang.String, java.lang.Integer]\r\n```\r\n\r\n### Expressions Framework\r\n\r\nThe `procyon-expressions` framework provides a more natural form of code generation.\r\nRather than requiring bytecode to be emitted directly, as with `procyon-reflection`\r\nand other popular libraries like ASM, `procyon-expressions` enables code composition\r\nusing declarative expression trees.  These expression trees may then be compiled directly\r\ninto callbacks or coupled with a `MethodBuilder`.  The `procyon-expressions` API is\r\nalmost a direct port of `System.Linq.Expressions` from .NET's Dynamic Language Runtime,\r\nminus the dynamic callsite support (and with more relaxed rules regarding type conversions).\r\n\r\n#### Example\r\n```java   \r\n//\r\n// This lambda closes over a complex constant (a String array).\r\n//\r\n\r\nfinal ConstantExpression items = constant(\r\n    new String[] { \"one\", \"two\", \"three\", \"four\", \"five\" }\r\n);\r\n\r\n//\r\n// If written in Java, the constructed expression would look something like this:\r\n// \r\n// () -\u003e {\r\n//     for (String item : \u003cclosure\u003eitems)\r\n//         System.out.printf(\"Got item: %s\\n\", item);\r\n// }\r\n//\r\n\r\nfinal ParameterExpression item = variable(Types.String, \"item\");\r\n\r\nfinal LambdaExpression\u003cRunnable\u003e runnable = lambda(\r\n    Type.of(Runnable.class),\r\n    forEach(\r\n        item,\r\n        items,\r\n        call(\r\n            field(null, Types.System.getField(\"out\")),\r\n            \"printf\",\r\n            constant(\"Got item: %s\\n\"),\r\n            item\r\n        )\r\n    )\r\n);\r\n\r\nSystem.out.println(runnable);\r\n\r\nfinal Runnable delegate = runnable.compile();\r\n\r\ndelegate.run();\r\n```\r\n\r\n#### Output\r\n```text\r\n() =\u003e for (String item : [one, two, three, four, five])\r\n    System.out.printf(\"Got item: %s\\n\", new Object[] { item })\r\n\r\nGot item: one\r\nGot item: two\r\nGot item: three\r\nGot item: four\r\nGot item: five\r\n```\r\n\r\n### Compiler Toolset\r\n\r\nThe `procyon-compilertools` project is a work in progress that includes:\r\n\r\n  1. Class metadata and bytecode inspection/manipulation facilities based on `Mono.Cecil`\r\n  2. An optimization and decompiler framework based on `ILSpy`\r\n\r\nThe Compiler Toolset is still early in development and subject to change.\r\n\r\n### Decompiler Front-End\r\n\r\n`procyon-decompiler` is a standalone front-end for the Java decompiler included in\r\n`procyon-compilertools`.  All dependencies are embedded in the JAR for easy redistribution.\r\nFor more information about the decompiler, see the [Java Decompiler](https://github.com/mstrobel/procyon/wiki/Java-Decompiler) wiki page.\r\n\r\n## Powered by Procyon\r\n\r\nCheck out these third party products based on Procyon!  Are you using Procyon in one of your projects?  Contact me ([email](mailto:mike.strobel@gmail.com) / [twitter](https://twitter.com/mstrobel)) if you would like it listed here. \r\n\r\n  - [SecureTeam Java Decompiler](http://www.secureteam.net/Java-Decompiler.aspx)   \r\n    A JavaFX-based decompiler front-end with fast and convenient code navigation.  Download it, or launch it directly from your browser.\r\n\r\n  - [Bytecode Viewer](https://github.com/Konloch/bytecode-viewer) is an open source Java decompilation, disassembly, and debugging suite by [@Konloch](https://twitter.com/Konloch).  It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower.\r\n","funding_links":[],"categories":["Java","Weapons","Tools"],"sub_categories":["Android","Decompilers"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmstrobel%2Fprocyon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmstrobel%2Fprocyon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmstrobel%2Fprocyon/lists"}