{"id":22707674,"url":"https://github.com/xvik/generics-resolver","last_synced_at":"2025-04-30T12:35:00.607Z","repository":{"id":23469163,"uuid":"26833503","full_name":"xvik/generics-resolver","owner":"xvik","description":"Java generics runtime resolver","archived":false,"fork":false,"pushed_at":"2024-06-18T23:32:43.000Z","size":2228,"stargazers_count":46,"open_issues_count":9,"forks_count":9,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-01-16T23:02:38.247Z","etag":null,"topics":["generics","java","reflection","utility"],"latest_commit_sha":null,"homepage":"https://xvik.github.io/generics-resolver","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xvik.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-11-18T22:38:43.000Z","updated_at":"2024-09-27T16:59:50.000Z","dependencies_parsed_at":"2023-11-18T06:24:58.902Z","dependency_job_id":"1ce083a0-da7f-437f-9093-43234ea68691","html_url":"https://github.com/xvik/generics-resolver","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xvik%2Fgenerics-resolver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xvik%2Fgenerics-resolver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xvik%2Fgenerics-resolver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xvik%2Fgenerics-resolver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xvik","download_url":"https://codeload.github.com/xvik/generics-resolver/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235426492,"owners_count":18988420,"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","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":["generics","java","reflection","utility"],"created_at":"2024-12-10T10:13:47.764Z","updated_at":"2025-01-24T11:08:07.745Z","avatar_url":"https://github.com/xvik.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Java generics runtime resolver\n[![License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://www.opensource.org/licenses/MIT)\n[![CI](https://github.com/xvik/generics-resolver/actions/workflows/CI.yml/badge.svg)](https://github.com/xvik/generics-resolver/actions/workflows/CI.yml)\n[![Appveyor build status](https://ci.appveyor.com/api/projects/status/github/xvik/generics-resolver?svg=true)](https://ci.appveyor.com/project/xvik/generics-resolver)\n[![codecov](https://codecov.io/gh/xvik/generics-resolver/branch/master/graph/badge.svg)](https://codecov.io/gh/xvik/generics-resolver)\n\n**DOCUMENTATION** https://xvik.github.io/generics-resolver\n\n### About\n\n```java\nclass Base\u003cT, K\u003e {\n  T doSomething(K arg);\n}\n\nclass Root extends Base\u003cInteger, Long\u003e {...}\n```\n\nLibrary was created to support reflection analysis (introspection) with all available types information.\n\n```java\n// compute generics for classes in Root hierarchy\nGenericsContext context = GenericsResolver.resolve(Root.class)\n        // switch current class to Base (to work in context of it)\n        .type(Base.class);\n\ncontext.generics() == [Integer.class, Long.class]\n\nMethodGenericsContext methodContext = context\n    .method(Base.class.getMethod(\"doSomething\", Object.class))\n// method return class (in context of Root)\nmethodContext.resolveReturnClass() == Integer.class\n// method parameters (in context of Root)\nmethodContext.resolveParameters() == [Long.class]\n```\n\nFeatures:\n* Resolves generics for hierarchies of any depth (all subclasses and interfaces on any level)\n* Supports \n    - composite generics (e.g. `Smth\u003cT, K extends List\u003cT\u003e\u003e`)\n    - method generics (`\u003cT\u003e T getSmth()`)\n    - constructor generics (`\u003cT\u003e Some(T arg)`)\n    - outer class generics (`Outer\u003cT\u003e.Inner`)\n* Context api completely prevents incorrect generics resolution (by doing automatic context switching)\n* Sub contexts: build context from Type in current context to properly solve root generics  \n* Generics backtracking: track higher type generics from some known middle type \n* To string types converter (useful for logging/reporting)\n* General types comparison api (assignability, compatibility, specificity checks)\n\nNOTE: Java 8 lambdas are *not supported* because there is no official way to analyze lambdas \ndue to [implementation](http://mail.openjdk.java.net/pipermail/compiler-dev/2015-January/009220.html).\nIt is [possible](https://github.com/jhalterman/typetools) to use [some hacks to resolve lambda geneics](https://stackoverflow.com/a/25613179/5186390) in some cases,\nbut it's quite fragile (may break on future java releases or not work on other java implementations).  \n\nLibrary targets actual classes analysis and, personally, I never really need to analyze lambdas. \n\nLibrary was originally written for [guice-persist-orient](https://github.com/xvik/guice-persist-orient) to support\nrepositories analysis and later used in [dropwizard-guicey](https://github.com/xvik/dropwizard-guicey) for extensions analysis.\n\nCompatible with Java 6 and above.\n\n##### Alternatives\n\nFor simple cases (e.g. to resolve class/interface generic value), look, maybe you already \nhave required tool in the classpath (and it will be enough):\n  \n* Guava [TypeToken](https://github.com/google/guava/wiki/ReflectionExplained#typetoken)\n* Spring [GenericTypeResolver](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/GenericTypeResolver.html)\n* Commons-lang3 [TypeUtils](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/reflect/TypeUtils.html) \n\n### Setup\n\n[![Maven Central](https://img.shields.io/maven-central/v/ru.vyarus/generics-resolver.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/ru.vyarus/generics-resolver)\n\nMaven:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eru.vyarus\u003c/groupId\u003e\n  \u003cartifactId\u003egenerics-resolver\u003c/artifactId\u003e\n  \u003cversion\u003e3.0.3\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nGradle:\n\n```groovy\nimplementation 'ru.vyarus:generics-resolver:3.0.3'\n```\n\n#### Snapshots\n\n\u003cdetails\u003e\n      \u003csummary\u003eSnapshots may be used through JitPack\u003c/summary\u003e\n      \n* Go to [JitPack project page](https://jitpack.io/#ru.vyarus/generics-resolver)\n* Select `Commits` section and click `Get it` on commit you want to use (top one - the most recent)\n* Follow displayed instruction: \n    - Add jitpack repository: `maven { url 'https://jitpack.io' }`\n    - Use commit hash as version: `ru.vyarus:generics-resolver:56537f7d23` (or use `master-SNAPSHOT`)\n    \n\u003c/details\u003e   \n\n### Usage\n\nRead [documentation](https://xvik.github.io/generics-resolver/)     \n      \n---\n[![java lib generator](http://img.shields.io/badge/Powered%20by-%20Java%20lib%20generator-green.svg?style=flat-square)](https://github.com/xvik/generator-lib-java)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxvik%2Fgenerics-resolver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxvik%2Fgenerics-resolver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxvik%2Fgenerics-resolver/lists"}