{"id":18595431,"url":"https://github.com/svenruppert/generatedtypesafedynamicobjectadapter-builder","last_synced_at":"2025-05-16T12:31:47.989Z","repository":{"id":32291520,"uuid":"35866387","full_name":"svenruppert/GeneratedTypesafeDynamicObjectAdapter-Builder","owner":"svenruppert","description":"How to generate a typesafe DynamicObjectAdapter-Builder per AnnotationProcessing. ","archived":false,"fork":false,"pushed_at":"2021-01-22T06:44:17.000Z","size":13,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-17T23:08:10.170Z","etag":null,"topics":["annotation-processing","builder-pattern","dynamicobjectadapter-builder","java","java-8","pattern"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/svenruppert.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-19T07:28:56.000Z","updated_at":"2020-03-30T02:21:06.000Z","dependencies_parsed_at":"2022-09-12T03:31:44.551Z","dependency_job_id":null,"html_url":"https://github.com/svenruppert/GeneratedTypesafeDynamicObjectAdapter-Builder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svenruppert%2FGeneratedTypesafeDynamicObjectAdapter-Builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svenruppert%2FGeneratedTypesafeDynamicObjectAdapter-Builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svenruppert%2FGeneratedTypesafeDynamicObjectAdapter-Builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svenruppert%2FGeneratedTypesafeDynamicObjectAdapter-Builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/svenruppert","download_url":"https://codeload.github.com/svenruppert/GeneratedTypesafeDynamicObjectAdapter-Builder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254529826,"owners_count":22086499,"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":["annotation-processing","builder-pattern","dynamicobjectadapter-builder","java","java-8","pattern"],"created_at":"2024-11-07T01:19:39.624Z","updated_at":"2025-05-16T12:31:47.941Z","avatar_url":"https://github.com/svenruppert.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GeneratedTypesafeDynamicObjectAdapter-Builder\nHow to generate a typesafe DynamicObjectAdapter-Builder per AnnotationProcessing. \n(a detailed description will come soon.....  follow me  [@SvenRuppert](https://twitter.com/SvenRuppert) )\nan german version you could find under [GitBook - JavaFundamentals - GeneratedTypesaveDynamicObjectAdapter-Builder](http://sven-ruppert.gitbooks.io/kurse/content/java-core/chapter-java-core-pattern-creational-builder-dynamic-object-adapter-builder-generated.html)\n\n1. mvn clean install at module genericbasics\n2. mvn clean install at module usages\n\nThis is an demo of how to use AnnotationProcessing to generate a DynamicObjectAdapter-Builder.\nThis is used inside the project [rapidpm/proxybuilder](https://github.com/RapidPM/proxybuilder).\n\nWhat you could do with this:\n\nAnnotate an Interface with ***@DynamicObjectAdapterBuilder***. \n```java\n@DynamicObjectAdapterBuilder\npublic interface Service {\n  String doWork_A(String txt);\n  String doWork_B(String txt);\n}\npublic class ServiceImpl implements Service {\n  @Override\n  public String doWork_A(String txt) {\n    return \"doWorkd_A_Original\";\n  }\n\n  @Override\n  public String doWork_B(String txt) {\n    return \"doWorkd_B_Original\";\n  }\n}\n```\ncompile will create ...\n```java\n@FunctionalInterface\npublic interface Service_doWork_A {\n  String doWork_A(final String txt);\n}\n\n@FunctionalInterface\npublic interface Service_doWork_B {\n  String doWork_B(final String txt);\n}\n\npublic class ServiceInvocationHandler extends ExtendedInvocationHandler\u003cService\u003e {\n  public void doWork_A(final Service_doWork_A adapter) {\n    addAdapter(adapter);\n  }\n\n  public void doWork_B(final Service_doWork_B adapter) {\n    addAdapter(adapter);\n  }\n}\n\npublic class ServiceAdapterBuilder extends AdapterBuilder\u003cService\u003e {\n  private final ServiceInvocationHandler invocationHandler = new ServiceInvocationHandler();\n\n  public static ServiceAdapterBuilder newBuilder() {\n    return new ServiceAdapterBuilder();\n  }\n\n  @Override\n  public ServiceInvocationHandler getInvocationHandler() {\n     return invocationHandler;\n  }\n\n  public ServiceAdapterBuilder setOriginal(final Service original) {\n    invocationHandler.setOriginal(original);\n    return this;\n  }\n\n  public ServiceAdapterBuilder withDoWork_A(final Service_doWork_A adapter) {\n    invocationHandler.doWork_A(adapter);\n    return this;\n  }\n\n  public ServiceAdapterBuilder withDoWork_B(final Service_doWork_B adapter) {\n    invocationHandler.doWork_B(adapter);\n    return this;\n  }\n}\n````\n\nNow you could use the DynamicObjectAdapter-Builder like the following.\n\n```java\n  public static void main(String[] args) {\n\n    Service service = ServiceAdapterBuilder.newBuilder()\n        .setOriginal(new ServiceImpl())\n        .withDoWork_A((txt) -\u003e txt + \"_part\")\n        .buildForTarget(Service.class);\n\n    System.out.println(service.doWork_A(\"Hallo Adapter\"));\n\n    final boolean proxyClass = Proxy.isProxyClass(service.getClass());\n    System.out.println(\"proxyClass = \" + proxyClass);\n\n    //Interface auf den InvocactionHandler\n    final InvocationHandler invocationHandler = Proxy.getInvocationHandler(service);\n    final ServiceInvocationHandler serviceInvocationHandler = (ServiceInvocationHandler) invocationHandler;\n\n    serviceInvocationHandler.doWork_A((txt) -\u003e txt + \"_part_modified\");\n    System.out.println(service.doWork_A(\"Hallo Adapter\"));\n\n    final Service serviceX = ServiceAdapterBuilder\n        .newBuilder()\n        .setOriginal(new ServiceImpl())\n        .withDoWork_A(txt -\u003e \"DOA-Builder Method A \" + txt)\n        .buildForTarget(Service.class);\n\n    System.out.println(serviceX.doWork_A(\"XX\"));\n  }\n````\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvenruppert%2Fgeneratedtypesafedynamicobjectadapter-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsvenruppert%2Fgeneratedtypesafedynamicobjectadapter-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvenruppert%2Fgeneratedtypesafedynamicobjectadapter-builder/lists"}