├── .github └── issue_template.md ├── .gitignore ├── .travis.yml ├── LICENSE.txt ├── README.md ├── jOOR-java-6 ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── joor │ │ │ ├── Compile.java │ │ │ ├── CompileOptions.java │ │ │ ├── Reflect.java │ │ │ └── ReflectException.java │ └── resources │ │ └── META-INF │ │ ├── LICENSE.txt │ │ └── README.txt │ └── test │ └── java │ └── org │ └── joor │ └── test │ ├── CompileOptionsTest.java │ ├── CompileTest.java │ ├── InterfaceWithDefaultMethods.java │ ├── PrivateConstructors.java │ ├── ReflectTest.java │ ├── TestHierarchicalMethodsBase.java │ ├── TestHierarchicalMethodsSubclass.java │ ├── TestPrivateStaticFinal.java │ └── interfaces │ ├── MapContainer.java │ ├── PartialStringAPI1.java │ ├── PartialStringAPI2.java │ ├── Test1.java │ ├── Test10.java │ ├── Test11.java │ ├── Test2.java │ ├── Test3.java │ ├── Test4.java │ ├── Test6.java │ └── Test8.java ├── jOOR-java-8 ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── joor │ │ │ ├── Compile.java │ │ │ ├── CompileOptions.java │ │ │ ├── Reflect.java │ │ │ └── ReflectException.java │ └── resources │ │ └── META-INF │ │ ├── LICENSE.txt │ │ └── README.txt │ └── test │ └── java │ └── org │ └── joor │ └── test │ ├── CompileOptionsTest.java │ ├── CompileTest.java │ ├── InterfaceWithDefaultMethods.java │ ├── PrivateConstructors.java │ ├── ReflectTest.java │ ├── TestHierarchicalMethodsBase.java │ ├── TestHierarchicalMethodsSubclass.java │ ├── TestPrivateStaticFinal.java │ └── interfaces │ ├── MapContainer.java │ ├── PartialStringAPI1.java │ ├── PartialStringAPI2.java │ ├── Test1.java │ ├── Test10.java │ ├── Test11.java │ ├── Test2.java │ ├── Test3.java │ ├── Test4.java │ ├── Test6.java │ └── Test8.java └── jOOR ├── pom.xml └── src ├── main ├── java │ ├── module-info.java │ └── org │ │ └── joor │ │ ├── Compile.java │ │ ├── CompileOptions.java │ │ ├── Reflect.java │ │ └── ReflectException.java └── resources │ └── META-INF │ ├── LICENSE.txt │ └── README.txt └── test └── java └── org └── joor └── test ├── CompileOptionsTest.java ├── CompileTest.java ├── InterfaceWithDefaultMethods.java ├── PrivateConstructors.java ├── ReflectTest.java ├── TestHierarchicalMethodsBase.java ├── TestHierarchicalMethodsSubclass.java ├── TestPrivateStaticFinal.java └── interfaces ├── MapContainer.java ├── PartialStringAPI1.java ├── PartialStringAPI2.java ├── Test1.java ├── Test10.java ├── Test11.java ├── Test2.java ├── Test3.java ├── Test4.java ├── Test6.java └── Test8.java /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | ### Expected behavior and actual behavior: 2 | 3 | ### Steps to reproduce the problem: 4 | 5 | ### Versions: 6 | 7 | - jOOR: 8 | - Java: 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | release/ 3 | 4 | .idea/ 5 | *.iml 6 | 7 | .settings/ 8 | .classpath 9 | .project 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: 3 | - openjdk9 4 | - openjdk10 5 | - openjdk11 6 | install: 7 | - sh -c 'cd jOOR && mvn install -DskipTests=true' 8 | - sh -c 'cd jOOR-java-8 && mvn install -DskipTests=true' 9 | - sh -c 'cd jOOR-java-6 && mvn install -DskipTests=true' 10 | script: 11 | - sh -c 'cd jOOR && mvn test' 12 | - sh -c 'cd jOOR-java-8 && mvn test' 13 | - sh -c 'cd jOOR-java-6 && mvn test' 14 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Overview 2 | 3 | jOOR stands for jOOR Object Oriented Reflection. It is a simple wrapper for the java.lang.reflect package. 4 | 5 | jOOR's name is inspired by jOOQ, a fluent API for SQL building and execution. 6 | 7 | 8 | ### Dependencies 9 | 10 | None! 11 | 12 | ### Download 13 | 14 | **For use with Java 9+** 15 | 16 | ```xml 17 | 18 | org.jooq 19 | joor 20 | 0.9.15 21 | 22 | ``` 23 | 24 | **For use with Java 8+** 25 | 26 | ```xml 27 | 28 | org.jooq 29 | joor-java-8 30 | 0.9.15 31 | 32 | ``` 33 | 34 | **For use with Java 6+** 35 | 36 | ```xml 37 | 38 | org.jooq 39 | joor-java-6 40 | 0.9.15 41 | 42 | ``` 43 | 44 | ### Simple example 45 | 46 | ````java 47 | // All examples assume the following static import: 48 | import static org.joor.Reflect.*; 49 | 50 | String world = onClass("java.lang.String") // Like Class.forName() 51 | .create("Hello World") // Call most specific matching constructor 52 | .call("substring", 6) // Call most specific matching substring() method 53 | .call("toString") // Call toString() 54 | .get(); // Get the wrapped object, in this case a String 55 | ```` 56 | 57 | 58 | ### Proxy abstraction 59 | 60 | jOOR also gives access to the java.lang.reflect.Proxy API in a simple way: 61 | 62 | ````java 63 | public interface StringProxy { 64 | String substring(int beginIndex); 65 | } 66 | 67 | String substring = onClass("java.lang.String") 68 | .create("Hello World") 69 | .as(StringProxy.class) // Create a proxy for the wrapped object 70 | .substring(6); // Call a proxy method 71 | ```` 72 | 73 | ### Runtime compilation of Java code 74 | 75 | jOOR has an optional dependency on the `java.compiler` module and simplifies access to `javax.tools.JavaCompiler` through the following API: 76 | 77 | ```java 78 | Supplier supplier = Reflect.compile( 79 | "com.example.HelloWorld", 80 | "package com.example;\n" + 81 | "class HelloWorld implements java.util.function.Supplier {\n" + 82 | " public String get() {\n" + 83 | " return \"Hello World!\";\n" + 84 | " }\n" + 85 | "}\n").create().get(); 86 | 87 | // Prints "Hello World!" 88 | System.out.println(supplier.get()); 89 | ``` 90 | 91 | ### Comparison with standard java.lang.reflect 92 | 93 | jOOR code: 94 | 95 | ````java 96 | Employee[] employees = on(department).call("getEmployees").get(); 97 | 98 | for (Employee employee : employees) { 99 | Street street = on(employee).call("getAddress").call("getStreet").get(); 100 | System.out.println(street); 101 | } 102 | ```` 103 | 104 | The same example with normal reflection in Java: 105 | 106 | ````java 107 | try { 108 | Method m1 = department.getClass().getMethod("getEmployees"); 109 | Employee[] employees = (Employee[]) m1.invoke(department); 110 | 111 | for (Employee employee : employees) { 112 | Method m2 = employee.getClass().getMethod("getAddress"); 113 | Address address = (Address) m2.invoke(employee); 114 | 115 | Method m3 = address.getClass().getMethod("getStreet"); 116 | Street street = (Street) m3.invoke(address); 117 | 118 | System.out.println(street); 119 | } 120 | } 121 | 122 | // There are many checked exceptions that you are likely to ignore anyway 123 | catch (Exception ignore) { 124 | 125 | // ... or maybe just wrap in your preferred runtime exception: 126 | throw new RuntimeException(e); 127 | } 128 | ```` 129 | 130 | 131 | ### Similar projects 132 | 133 | Everyday Java reflection with a fluent interface: 134 | 135 | * http://docs.codehaus.org/display/FEST/Reflection+Module 136 | * http://projetos.vidageek.net/mirror/mirror/ 137 | 138 | Reflection modelled as XPath (quite interesting!) 139 | 140 | * http://commons.apache.org/jxpath/users-guide.html 141 | 142 | -------------------------------------------------------------------------------- /jOOR-java-6/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 4.0.0 6 | 7 | org.jooq 8 | joor-java-6 9 | 0.9.16-SNAPSHOT 10 | bundle 11 | 12 | jOOR 13 | jOOR is a recursive acronym that stands for jOOR Object Oriented Reflection. It is a simple wrapper for the java.lang.reflect package. 14 | https://github.com/jOOQ/jOOR 15 | 16 | 17 | 18 | Apache License, Version 2.0 19 | http://www.apache.org/licenses/LICENSE-2.0 20 | repo 21 | 22 | 23 | 24 | 25 | git@github.com:jOOQ/jOOR.git 26 | git@github.com:jOOQ/jOOR.git 27 | git@github.com:jOOQ/jOOR.git 28 | 29 | 30 | 31 | deploy 32 | ${project.artifactId}-${project.version} 33 | 34 | 35 | 36 | org.apache.maven.plugins 37 | maven-compiler-plugin 38 | 3.13.0 39 | 40 | true 41 | 512m 42 | 256m 43 | UTF-8 44 | 45 | 46 | 47 | 48 | 1.6 49 | 1.6 50 | true 51 | lines,vars,source 52 | 53 | 54 | 55 | 56 | org.apache.maven.plugins 57 | maven-resources-plugin 58 | 2.5 59 | 60 | UTF-8 61 | 62 | 63 | 64 | 65 | org.apache.maven.plugins 66 | maven-eclipse-plugin 67 | 2.8 68 | 69 | true 70 | 71 | 72 | 73 | 74 | org.apache.felix 75 | maven-bundle-plugin 76 | 3.5.0 77 | true 78 | 79 | 80 | 81 | 82 | 83 | 84 | release-oss 85 | 86 | 87 | 88 | 89 | sonatype-nexus-staging 90 | Nexus Release Repository 91 | https://oss.sonatype.org/service/local/staging/deploy/maven2/ 92 | 93 | 94 | 95 | 96 | 97 | 98 | org.apache.maven.plugins 99 | maven-source-plugin 100 | 3.2.1 101 | true 102 | 103 | 104 | attach-sources 105 | 106 | jar 107 | 108 | 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | org.apache.maven.plugins 118 | maven-javadoc-plugin 119 | 3.6.3 120 | true 121 | 122 | 123 | bundle-sources 124 | package 125 | 126 | jar 127 | 128 | 129 | 130 | 131 | 1024 132 | UTF-8 133 | protected 134 | true 135 | 136 | en 137 | 138 | 139 | -Xdoclint:none 140 | -Xdoclint:none 141 | 142 | 143 | 144 | 145 | 146 | org.apache.maven.plugins 147 | maven-resources-plugin 148 | 149 | 150 | copy-folder 151 | package 152 | 153 | copy-resources 154 | 155 | 156 | ${project.build.directory}/apidocs-ga 157 | 158 | 159 | false 160 | ${project.build.directory}/apidocs 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | com.google.code.maven-replacer-plugin 171 | replacer 172 | 1.5.3 173 | 174 | 175 | replace-apidocs-jar 176 | package 177 | 178 | replace 179 | 180 | 181 | 182 | true 183 | ${project.build.directory}/apidocs 184 | 185 | **/*.html 186 | 187 | 188 | 189 | ]]> 190 | 192 | 193 | 194 | ]]> 195 | 196 | 197 | 198 | 199 | 200 | 201 | replace-apidocs-ga 202 | package 203 | 204 | replace 205 | 206 | 207 | 208 | 209 | 210 | true 211 | ${project.build.directory}/apidocs-ga 212 | 213 | **/*.html 214 | 215 | 216 | 217 | ]]> 218 | 220 | 221 | 228 | 229 | ]]> 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | org.apache.maven.plugins 239 | maven-antrun-plugin 240 | 1.6 241 | 242 | 243 | repack 244 | package 245 | 246 | run 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | org.apache.maven.plugins 260 | maven-gpg-plugin 261 | 3.0.1 262 | 263 | 264 | sign-artifacts 265 | verify 266 | 267 | sign 268 | 269 | 270 | 271 | --pinentry-mode 272 | loopback 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | GitHub 285 | https://github.com/jOOQ/jOOR/issues 286 | 287 | 288 | 289 | 290 | Lukas Eder 291 | lukas.eder@gmail.com 292 | 293 | 294 | 295 | 296 | 297 | junit 298 | junit 299 | 4.13.1 300 | jar 301 | test 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /jOOR-java-6/src/main/java/org/joor/Compile.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | -------------------------------------------------------------------------------- /jOOR-java-6/src/main/java/org/joor/CompileOptions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /jOOR-java-6/src/main/java/org/joor/ReflectException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | import java.lang.reflect.InvocationTargetException; 17 | 18 | /** 19 | * A unchecked wrapper for any of Java's checked reflection exceptions: 20 | *

21 | * These exceptions are 22 | *

32 | * 33 | * @author Lukas Eder 34 | */ 35 | public class ReflectException extends RuntimeException { 36 | 37 | /** 38 | * Generated UID 39 | */ 40 | private static final long serialVersionUID = -6213149635297151442L; 41 | 42 | public ReflectException(String message) { 43 | super(message); 44 | } 45 | 46 | public ReflectException(String message, Throwable cause) { 47 | super(message, cause); 48 | } 49 | 50 | public ReflectException() { 51 | super(); 52 | } 53 | 54 | public ReflectException(Throwable cause) { 55 | super(cause); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /jOOR-java-6/src/main/resources/META-INF/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. -------------------------------------------------------------------------------- /jOOR-java-6/src/main/resources/META-INF/README.txt: -------------------------------------------------------------------------------- 1 | Thanks for downloading jOOR. 2 | Please visit http://code.google.com/p/joor/ for more information. -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/CompileOptionsTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/CompileTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/InterfaceWithDefaultMethods.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | /** 17 | * @author Thomas Darimont 18 | */ 19 | public interface InterfaceWithDefaultMethods { 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/PrivateConstructors.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | @SuppressWarnings("all") 17 | public class PrivateConstructors { 18 | 19 | public final String string; 20 | 21 | private PrivateConstructors() { 22 | this(null); 23 | } 24 | 25 | private PrivateConstructors(String string) { 26 | this.string = string; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/TestHierarchicalMethodsBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_BASE"; 19 | public static String PRIVATE_RESULT = "PRIVATE_BASE"; 20 | 21 | private int invisibleField1; 22 | private int invisibleField2; 23 | public int visibleField1; 24 | public int visibleField2; 25 | 26 | public String pub_base_method(int number) { 27 | return PUBLIC_RESULT; 28 | } 29 | public String pub_method(int number) { 30 | return PUBLIC_RESULT; 31 | } 32 | 33 | private String priv_method(int number) { 34 | return PRIVATE_RESULT; 35 | } 36 | 37 | private String very_priv_method() { 38 | return PRIVATE_RESULT; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/TestHierarchicalMethodsSubclass.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsSubclass extends TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_SUB"; 19 | public static String PRIVATE_RESULT = "PRIVATE_SUB"; 20 | 21 | // Both of these are hiding fields in the super type 22 | private int invisibleField2; 23 | public int visibleField2; 24 | 25 | private int invisibleField3; 26 | public int visibleField3; 27 | 28 | private String priv_method(int number) { 29 | return PRIVATE_RESULT; 30 | } 31 | 32 | private String pub_method(Integer number) { 33 | return PRIVATE_RESULT; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/TestPrivateStaticFinal.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test; 17 | 18 | /** 19 | * @author Lukas Eder 20 | */ 21 | @SuppressWarnings("deprecation") 22 | public class TestPrivateStaticFinal { 23 | private static final int I1 = new Integer(1); 24 | private static final Integer I2 = new Integer(1); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/MapContainer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | import java.util.HashMap; 17 | import java.util.Map; 18 | 19 | public class MapContainer { 20 | public Map map = new HashMap(); 21 | 22 | public void put(String name, String value) { 23 | map.put(name, value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/PartialStringAPI1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI1 { 20 | 21 | String substring(int beginIndex); 22 | String substring(int beginIndex, int endIndex); 23 | 24 | String substring(Integer beginIndex); 25 | String substring(Integer beginIndex, Integer endIndex); 26 | } 27 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/PartialStringAPI2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI2 { 20 | 21 | boolean contains(CharSequence string); 22 | } 23 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test1 { 20 | public static int S_INT1; 21 | public static Integer S_INT2; 22 | public int I_INT1; 23 | public Integer I_INT2; 24 | 25 | public static Test1 S_DATA; 26 | public Test1 I_DATA; 27 | } 28 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test10.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test10 { 20 | 21 | public final String s; 22 | public final Integer i; 23 | 24 | Test10(int i) { 25 | this(null, i); 26 | } 27 | 28 | Test10(String s) { 29 | this(s, null); 30 | } 31 | 32 | Test10(String s, int i) { 33 | this(s, (Integer) i); 34 | } 35 | 36 | Test10(String s, Integer i) { 37 | this.s = s; 38 | this.i = i; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test11.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test.interfaces; 17 | 18 | @SuppressWarnings("deprecation") 19 | public class Test11 { 20 | 21 | 22 | public static final int SF_INT1 = new Integer(0); 23 | public static final Integer SF_INT2 = new Integer(0); 24 | public final int F_INT1 = new Integer(0); 25 | public final Integer F_INT2 = new Integer(0); 26 | 27 | public static Test11 S_DATA; 28 | public Test11 I_DATA; 29 | } 30 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test2 { 20 | 21 | public final Object n; 22 | public final ConstructorType constructorType; 23 | 24 | public Test2() { 25 | this.n = null; 26 | this.constructorType = ConstructorType.NO_ARGS; 27 | } 28 | 29 | public Test2(Integer n) { 30 | this.n = n; 31 | this.constructorType = ConstructorType.INTEGER; 32 | } 33 | 34 | public Test2(Number n) { 35 | this.n = n; 36 | this.constructorType = ConstructorType.NUMBER; 37 | } 38 | 39 | public Test2(Object n) { 40 | this.n = n; 41 | this.constructorType = ConstructorType.OBJECT; 42 | } 43 | 44 | public static enum ConstructorType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test3.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test3 { 20 | 21 | public Object n; 22 | public MethodType methodType; 23 | 24 | public void method() { 25 | this.n = null; 26 | this.methodType = MethodType.NO_ARGS; 27 | } 28 | 29 | public void method(Integer n1) { 30 | this.n = n1; 31 | this.methodType = MethodType.INTEGER; 32 | } 33 | 34 | public void method(Number n1) { 35 | this.n = n1; 36 | this.methodType = MethodType.NUMBER; 37 | } 38 | 39 | public void method(Object n1) { 40 | this.n = n1; 41 | this.methodType = MethodType.OBJECT; 42 | } 43 | 44 | public static enum MethodType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test4.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test4 { 17 | 18 | public static void s_method() { 19 | } 20 | 21 | public void i_method() { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test6.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public interface Test6 { 17 | void setFoo(String s); 18 | void setBar(boolean b); 19 | void setBaz(String baz); 20 | void testIgnore(); 21 | 22 | String getFoo(); 23 | boolean isBar(); 24 | String getBaz(); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-6/src/test/java/org/joor/test/interfaces/Test8.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test8 { 17 | 18 | private static void s_method() { 19 | } 20 | 21 | private void i_method() { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jOOR-java-8/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 4.0.0 6 | 7 | org.jooq 8 | joor-java-8 9 | 0.9.16-SNAPSHOT 10 | bundle 11 | 12 | jOOR 13 | jOOR is a recursive acronym that stands for jOOR Object Oriented Reflection. It is a simple wrapper for the java.lang.reflect package. 14 | https://github.com/jOOQ/jOOR 15 | 16 | 17 | 18 | Apache License, Version 2.0 19 | http://www.apache.org/licenses/LICENSE-2.0 20 | repo 21 | 22 | 23 | 24 | 25 | git@github.com:jOOQ/jOOR.git 26 | git@github.com:jOOQ/jOOR.git 27 | git@github.com:jOOQ/jOOR.git 28 | 29 | 30 | 31 | deploy 32 | ${project.artifactId}-${project.version} 33 | 34 | 35 | 36 | org.apache.maven.plugins 37 | maven-compiler-plugin 38 | 3.13.0 39 | 40 | true 41 | 512m 42 | 256m 43 | UTF-8 44 | 45 | 46 | 47 | 48 | 1.8 49 | 1.8 50 | true 51 | lines,vars,source 52 | 53 | 54 | 55 | 56 | org.apache.maven.plugins 57 | maven-resources-plugin 58 | 2.5 59 | 60 | UTF-8 61 | 62 | 63 | 64 | 65 | org.apache.maven.plugins 66 | maven-eclipse-plugin 67 | 2.8 68 | 69 | true 70 | 71 | 72 | 73 | 74 | org.apache.felix 75 | maven-bundle-plugin 76 | 3.5.0 77 | true 78 | 79 | 80 | 81 | 82 | 83 | 84 | release-oss 85 | 86 | 87 | 88 | 89 | sonatype-nexus-staging 90 | Nexus Release Repository 91 | https://oss.sonatype.org/service/local/staging/deploy/maven2/ 92 | 93 | 94 | 95 | 96 | 97 | 98 | org.apache.maven.plugins 99 | maven-source-plugin 100 | 3.2.1 101 | true 102 | 103 | 104 | attach-sources 105 | 106 | jar 107 | 108 | 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | org.apache.maven.plugins 118 | maven-javadoc-plugin 119 | 3.6.3 120 | true 121 | 122 | 123 | bundle-sources 124 | package 125 | 126 | jar 127 | 128 | 129 | 130 | 131 | 1024 132 | UTF-8 133 | protected 134 | true 135 | 136 | en 137 | 138 | 139 | -Xdoclint:none 140 | -Xdoclint:none 141 | 142 | 143 | 144 | 145 | 146 | org.apache.maven.plugins 147 | maven-resources-plugin 148 | 149 | 150 | copy-folder 151 | package 152 | 153 | copy-resources 154 | 155 | 156 | ${project.build.directory}/apidocs-ga 157 | 158 | 159 | false 160 | ${project.build.directory}/apidocs 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | com.google.code.maven-replacer-plugin 171 | replacer 172 | 1.5.3 173 | 174 | 175 | replace-apidocs-jar 176 | package 177 | 178 | replace 179 | 180 | 181 | 182 | true 183 | ${project.build.directory}/apidocs 184 | 185 | **/*.html 186 | 187 | 188 | 189 | ]]> 190 | 192 | 193 | 194 | ]]> 195 | 196 | 197 | 198 | 199 | 200 | 201 | replace-apidocs-ga 202 | package 203 | 204 | replace 205 | 206 | 207 | 208 | 209 | 210 | true 211 | ${project.build.directory}/apidocs-ga 212 | 213 | **/*.html 214 | 215 | 216 | 217 | ]]> 218 | 220 | 221 | 228 | 229 | ]]> 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | org.apache.maven.plugins 239 | maven-antrun-plugin 240 | 1.6 241 | 242 | 243 | repack 244 | package 245 | 246 | run 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | org.apache.maven.plugins 260 | maven-gpg-plugin 261 | 3.0.1 262 | 263 | 264 | sign-artifacts 265 | verify 266 | 267 | sign 268 | 269 | 270 | 271 | --pinentry-mode 272 | loopback 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | GitHub 285 | https://github.com/jOOQ/jOOR/issues 286 | 287 | 288 | 289 | 290 | Lukas Eder 291 | lukas.eder@gmail.com 292 | 293 | 294 | 295 | 296 | 297 | junit 298 | junit 299 | 4.13.1 300 | jar 301 | test 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /jOOR-java-8/src/main/java/org/joor/Compile.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | 17 | 18 | // ... 19 | 20 | import java.io.ByteArrayOutputStream; 21 | import java.io.File; 22 | import java.io.OutputStream; 23 | import java.io.StringWriter; 24 | import java.lang.invoke.MethodHandles; 25 | import java.lang.invoke.MethodHandles.Lookup; 26 | import java.net.URI; 27 | import java.net.URL; 28 | import java.net.URLClassLoader; 29 | import java.nio.charset.StandardCharsets; 30 | import java.util.ArrayDeque; 31 | import java.util.ArrayList; 32 | import java.util.Arrays; 33 | import java.util.Deque; 34 | import java.util.LinkedHashMap; 35 | import java.util.List; 36 | import java.util.Map; 37 | import java.util.Map.Entry; 38 | 39 | import javax.tools.FileObject; 40 | import javax.tools.ForwardingJavaFileManager; 41 | import javax.tools.JavaCompiler; 42 | import javax.tools.JavaCompiler.CompilationTask; 43 | import javax.tools.JavaFileManager; 44 | import javax.tools.SimpleJavaFileObject; 45 | import javax.tools.StandardJavaFileManager; 46 | import javax.tools.ToolProvider; 47 | 48 | 49 | /** 50 | * A utility that simplifies in-memory compilation of new classes. 51 | * 52 | * @author Lukas Eder 53 | */ 54 | class Compile { 55 | 56 | static Class compile(String className, String content, CompileOptions compileOptions) { 57 | return compile(className, content, compileOptions, true); 58 | } 59 | 60 | static Class compile(String className, String content, CompileOptions compileOptions, boolean expectResult) { 61 | Lookup lookup = MethodHandles.lookup(); 62 | ClassLoader cl = compileOptions.classLoader != null 63 | ? compileOptions.classLoader 64 | : lookup.lookupClass().getClassLoader(); 65 | 66 | try { 67 | return cl.loadClass(className); 68 | } 69 | catch (ClassNotFoundException ignore) { 70 | JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 71 | 72 | if (compiler == null) 73 | throw new ReflectException("No compiler was provided by ToolProvider.getSystemJavaCompiler(). Make sure the jdk.compiler module is available."); 74 | 75 | try { 76 | ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null)); 77 | 78 | List files = new ArrayList<>(); 79 | files.add(new CharSequenceJavaFileObject(className, content)); 80 | StringWriter out = new StringWriter(); 81 | 82 | List options = new ArrayList<>(compileOptions.options); 83 | if (!options.contains("-classpath")) { 84 | StringBuilder classpath = new StringBuilder(); 85 | String separator = System.getProperty("path.separator"); 86 | String cp = System.getProperty("java.class.path"); 87 | String mp = System.getProperty("jdk.module.path"); 88 | 89 | if (cp != null && !"".equals(cp)) 90 | classpath.append(cp); 91 | if (mp != null && !"".equals(mp)) 92 | classpath.append(mp); 93 | 94 | if (cl instanceof URLClassLoader) { 95 | for (URL url : ((URLClassLoader) cl).getURLs()) { 96 | if (classpath.length() > 0) 97 | classpath.append(separator); 98 | 99 | if ("file".equals(url.getProtocol())) 100 | classpath.append(new File(url.toURI())); 101 | } 102 | } 103 | 104 | options.addAll(Arrays.asList("-classpath", classpath.toString())); 105 | } 106 | 107 | CompilationTask task = compiler.getTask(out, fileManager, null, options, null, files); 108 | 109 | if (!compileOptions.processors.isEmpty()) 110 | task.setProcessors(compileOptions.processors); 111 | 112 | task.call(); 113 | 114 | if (fileManager.isEmpty()) { 115 | if (!expectResult) 116 | return null; 117 | 118 | throw new ReflectException("Compilation error: " + out); 119 | } 120 | 121 | Class result = null; 122 | 123 | // This works if we have private-access to the interfaces in the class hierarchy 124 | if (Reflect.CACHED_LOOKUP_CONSTRUCTOR != null) { 125 | result = fileManager.loadAndReturnMainClass(className, 126 | (name, bytes) -> Reflect.on(cl).call("defineClass", name, bytes, 0, bytes.length).get()); 127 | } 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | return result; 170 | } 171 | catch (ReflectException e) { 172 | throw e; 173 | } 174 | catch (Exception e) { 175 | throw new ReflectException("Error while compiling " + className, e); 176 | } 177 | } 178 | } 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | static final class JavaFileObject extends SimpleJavaFileObject { 203 | final ByteArrayOutputStream os = new ByteArrayOutputStream(); 204 | 205 | JavaFileObject(String name, JavaFileObject.Kind kind) { 206 | super(URI.create("string:///" + name.replace('.', '/') + kind.extension), kind); 207 | } 208 | 209 | byte[] getBytes() { 210 | return os.toByteArray(); 211 | } 212 | 213 | @Override 214 | public OutputStream openOutputStream() { 215 | return os; 216 | } 217 | 218 | @Override 219 | public CharSequence getCharContent(boolean ignoreEncodingErrors) { 220 | return new String(os.toByteArray(), StandardCharsets.UTF_8); 221 | } 222 | } 223 | 224 | static final class ClassFileManager extends ForwardingJavaFileManager { 225 | private final Map fileObjectMap; 226 | private Map classes; 227 | 228 | ClassFileManager(StandardJavaFileManager standardManager) { 229 | super(standardManager); 230 | 231 | fileObjectMap = new LinkedHashMap<>(); 232 | } 233 | 234 | @Override 235 | public JavaFileObject getJavaFileForOutput( 236 | JavaFileManager.Location location, 237 | String className, 238 | JavaFileObject.Kind kind, 239 | FileObject sibling 240 | ) { 241 | JavaFileObject result = new JavaFileObject(className, kind); 242 | fileObjectMap.put(className, result); 243 | return result; 244 | } 245 | 246 | boolean isEmpty() { 247 | return fileObjectMap.isEmpty(); 248 | } 249 | 250 | Map classes() { 251 | if (classes == null) { 252 | classes = new LinkedHashMap<>(); 253 | 254 | for (Entry entry : fileObjectMap.entrySet()) 255 | classes.put(entry.getKey(), entry.getValue().getBytes()); 256 | } 257 | 258 | return classes; 259 | } 260 | 261 | Class loadAndReturnMainClass(String mainClassName, ThrowingBiFunction> definer) throws Exception { 262 | Class result = null; 263 | 264 | // [#117] We don't know the subclass hierarchy of the top level 265 | // classes in the compilation unit, and we can't find out 266 | // without either: 267 | // 268 | // - class loading them (which fails due to NoClassDefFoundError) 269 | // - using a library like ASM (which is a big and painful dependency) 270 | // 271 | // Simple workaround: try until it works, in O(n^2), where n 272 | // can be reasonably expected to be small. 273 | Deque> queue = new ArrayDeque<>(classes().entrySet()); 274 | int n1 = queue.size(); 275 | 276 | // Try at most n times 277 | for (int i1 = 0; i1 < n1 && !queue.isEmpty(); i1++) { 278 | int n2 = queue.size(); 279 | 280 | for (int i2 = 0; i2 < n2; i2++) { 281 | Entry entry = queue.pop(); 282 | 283 | try { 284 | Class c = definer.apply(entry.getKey(), entry.getValue()); 285 | 286 | if (mainClassName.equals(entry.getKey())) 287 | result = c; 288 | } 289 | catch (ReflectException e) { 290 | queue.offer(entry); 291 | } 292 | } 293 | } 294 | 295 | return result; 296 | } 297 | } 298 | 299 | @FunctionalInterface 300 | interface ThrowingBiFunction { 301 | R apply(T t, U u) throws Exception; 302 | } 303 | 304 | static final class CharSequenceJavaFileObject extends SimpleJavaFileObject { 305 | final CharSequence content; 306 | 307 | public CharSequenceJavaFileObject(String className, CharSequence content) { 308 | super(URI.create("string:///" + className.replace('.', '/') + JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE); 309 | this.content = content; 310 | } 311 | 312 | @Override 313 | public CharSequence getCharContent(boolean ignoreEncodingErrors) { 314 | return content; 315 | } 316 | } 317 | } 318 | 319 | -------------------------------------------------------------------------------- /jOOR-java-8/src/main/java/org/joor/CompileOptions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | 17 | 18 | import java.util.Arrays; 19 | 20 | import java.util.Collections; 21 | import java.util.List; 22 | 23 | import javax.annotation.processing.Processor; 24 | 25 | /** 26 | * @author Lukas Eder 27 | */ 28 | public final class CompileOptions { 29 | 30 | final List processors; 31 | final List options; 32 | final ClassLoader classLoader; 33 | 34 | public CompileOptions() { 35 | this( 36 | Collections.emptyList(), 37 | Collections.emptyList(), 38 | null 39 | ); 40 | } 41 | 42 | private CompileOptions( 43 | List processors, 44 | List options, 45 | ClassLoader classLoader 46 | ) { 47 | this.processors = processors; 48 | this.options = options; 49 | this.classLoader = classLoader; 50 | } 51 | 52 | public final CompileOptions processors(Processor... newProcessors) { 53 | return processors(Arrays.asList(newProcessors)); 54 | } 55 | 56 | public final CompileOptions processors(List newProcessors) { 57 | return new CompileOptions(newProcessors, options, classLoader); 58 | } 59 | 60 | public final CompileOptions options(String... newOptions) { 61 | return options(Arrays.asList(newOptions)); 62 | } 63 | 64 | public final CompileOptions options(List newOptions) { 65 | return new CompileOptions(processors, newOptions, classLoader); 66 | } 67 | 68 | final boolean hasOption(String opt) { 69 | for (String option : options) 70 | if (option.equalsIgnoreCase(opt)) 71 | return true; 72 | 73 | return false; 74 | } 75 | 76 | public final CompileOptions classLoader(ClassLoader newClassLoader) { 77 | return new CompileOptions(processors, options, newClassLoader); 78 | } 79 | } 80 | 81 | -------------------------------------------------------------------------------- /jOOR-java-8/src/main/java/org/joor/ReflectException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | import java.lang.reflect.InvocationTargetException; 17 | 18 | /** 19 | * A unchecked wrapper for any of Java's checked reflection exceptions: 20 | *

21 | * These exceptions are 22 | *

    23 | *
  • {@link ClassNotFoundException}
  • 24 | *
  • {@link IllegalAccessException}
  • 25 | *
  • {@link IllegalArgumentException}
  • 26 | *
  • {@link InstantiationException}
  • 27 | *
  • {@link InvocationTargetException}
  • 28 | *
  • {@link NoSuchMethodException}
  • 29 | *
  • {@link NoSuchFieldException}
  • 30 | *
  • {@link SecurityException}
  • 31 | *
32 | * 33 | * @author Lukas Eder 34 | */ 35 | public class ReflectException extends RuntimeException { 36 | 37 | /** 38 | * Generated UID 39 | */ 40 | private static final long serialVersionUID = -6213149635297151442L; 41 | 42 | public ReflectException(String message) { 43 | super(message); 44 | } 45 | 46 | public ReflectException(String message, Throwable cause) { 47 | super(message, cause); 48 | } 49 | 50 | public ReflectException() { 51 | super(); 52 | } 53 | 54 | public ReflectException(Throwable cause) { 55 | super(cause); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /jOOR-java-8/src/main/resources/META-INF/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. -------------------------------------------------------------------------------- /jOOR-java-8/src/main/resources/META-INF/README.txt: -------------------------------------------------------------------------------- 1 | Thanks for downloading jOOR. 2 | Please visit http://code.google.com/p/joor/ for more information. -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/CompileOptionsTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | 17 | 18 | import static org.junit.Assert.assertEquals; 19 | import static org.junit.Assert.assertFalse; 20 | import static org.junit.Assert.assertNull; 21 | import static org.junit.Assert.assertTrue; 22 | import static org.junit.Assert.fail; 23 | 24 | import java.io.Serializable; 25 | import java.util.Collections; 26 | import java.util.Set; 27 | import java.util.concurrent.atomic.AtomicBoolean; 28 | 29 | import javax.annotation.processing.Completion; 30 | import javax.annotation.processing.ProcessingEnvironment; 31 | import javax.annotation.processing.Processor; 32 | import javax.annotation.processing.RoundEnvironment; 33 | import javax.lang.model.SourceVersion; 34 | import javax.lang.model.element.AnnotationMirror; 35 | import javax.lang.model.element.Element; 36 | import javax.lang.model.element.ExecutableElement; 37 | import javax.lang.model.element.TypeElement; 38 | 39 | import org.joor.CompileOptions; 40 | import org.joor.Reflect; 41 | import org.joor.ReflectException; 42 | import org.junit.Test; 43 | 44 | /** 45 | * @author Lukas Eder 46 | */ 47 | public class CompileOptionsTest { 48 | 49 | @Test 50 | public void testCompileWithCustomClassLoader() throws Exception { 51 | AtomicBoolean called = new AtomicBoolean(); 52 | CompileOptions co = new CompileOptions().classLoader(new ClassLoader() { 53 | 54 | protected Class findClass(String name) { 55 | called.set(true); 56 | return Object.class; 57 | } 58 | 59 | public Class loadClass(String name) { 60 | called.set(true); 61 | return Object.class; 62 | } 63 | }); 64 | 65 | String className = "com.example.CompileWithCustomClassLoader"; 66 | String classCode = 67 | "package com.example;\n" + 68 | "class CompileWithCustomClassLoader implements java.io.Serializable {}\n"; 69 | 70 | Object o1 = Reflect.compile(className, classCode).create().get(); 71 | assertEquals(className, o1.getClass().getName()); 72 | assertTrue(o1 instanceof Serializable); 73 | 74 | Object o2 = Reflect.compile(className, classCode, co).create().get(); 75 | assertTrue(called.get()); 76 | assertEquals("java.lang.Object", o2.getClass().getName()); 77 | assertFalse(o2 instanceof Serializable); 78 | } 79 | @Test 80 | public void testCompileWithExtraOptions() { 81 | assertEquals("org.joor.test.Source7OK", Reflect.compile( 82 | "org.joor.test.Source7OK", 83 | "package org.joor.test; " 84 | + "public class Source7OK {" 85 | + "}", 86 | new CompileOptions().options("-source", "7") 87 | ).type().getName()); 88 | 89 | try { 90 | Reflect.compile( 91 | "org.joor.test.Source7NOK", 92 | "package org.joor.test; " 93 | + "public interface Source7NOK {" 94 | + " default void m() {}" 95 | + "}", 96 | new CompileOptions().options("-source", "7") 97 | ).type(); 98 | 99 | fail("Class should not compile with source level 7"); 100 | } 101 | catch (ReflectException expected) {} 102 | 103 | assertEquals("org.joor.test.Source8OK", Reflect.compile( 104 | "org.joor.test.Source8OK", 105 | "package org.joor.test; " 106 | + "public interface Source8OK {" 107 | + " default void m() {}" 108 | + "}", 109 | new CompileOptions().options("-source", "8") 110 | ).type().getName()); 111 | 112 | try { 113 | Reflect.compile( 114 | "org.joor.test.Source8NOK", 115 | "package org.joor.test; " 116 | + "public interface Source8NOK {" 117 | + " private void m() {}" 118 | + "}", 119 | new CompileOptions().options("-source", "8") 120 | ).create().get(); 121 | 122 | fail("Class should not compile with source level 8"); 123 | } 124 | catch (ReflectException expected) {} 125 | 126 | try { 127 | Reflect.compile( 128 | "org.joor.test.Invalid", 129 | "package org.joor.test; " 130 | + "public class Invalid {" 131 | + "}", 132 | new CompileOptions().options("-invalidflag") 133 | ); 134 | 135 | fail("Expected ReflectException for -invalidflag"); 136 | } 137 | catch (ReflectException expected) { 138 | assertTrue(expected.getCause() instanceof IllegalArgumentException); 139 | } 140 | } 141 | 142 | @Test 143 | public void testCompileWithAnnotationProcessors() throws Exception { 144 | AProcessor p = new AProcessor(); 145 | 146 | try { 147 | Reflect.compile( 148 | "org.joor.test.FailAnnotationProcessing", 149 | "package org.joor.test; " 150 | + "@A " 151 | + "public class FailAnnotationProcessing {" 152 | + "}", 153 | new CompileOptions().processors(p) 154 | ).create().get(); 155 | 156 | fail("Expected ReflectException for bad annotation"); 157 | } 158 | catch (ReflectException expected) { 159 | assertFalse(p.processed); 160 | } 161 | 162 | Reflect.compile( 163 | "org.joor.test.SucceedAnnotationProcessing", 164 | "package org.joor.test; " 165 | + "@A @B " 166 | + "public class SucceedAnnotationProcessing {" 167 | + "}", 168 | new CompileOptions().processors(p) 169 | ).create().get(); 170 | assertTrue(p.processed); 171 | } 172 | 173 | static class AProcessor implements Processor { 174 | boolean processed; 175 | 176 | @Override 177 | public Set getSupportedOptions() { 178 | return Collections.emptySet(); 179 | } 180 | 181 | @Override 182 | public Set getSupportedAnnotationTypes() { 183 | return Collections.singleton("*"); 184 | } 185 | 186 | @Override 187 | public SourceVersion getSupportedSourceVersion() { 188 | return SourceVersion.RELEASE_8; 189 | } 190 | 191 | @Override 192 | public void init(ProcessingEnvironment processingEnv) { 193 | } 194 | 195 | @Override 196 | public boolean process(Set annotations, RoundEnvironment roundEnv) { 197 | for (TypeElement e1 : annotations) 198 | if (e1.getQualifiedName().contentEquals(A.class.getName())) 199 | for (Element e2 : roundEnv.getElementsAnnotatedWith(e1)) 200 | if (e2.getAnnotation(B.class) == null) 201 | throw new RuntimeException("Annotation A must be accompanied by annotation B"); 202 | 203 | this.processed = true; 204 | return false; 205 | } 206 | 207 | @Override 208 | public Iterable getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, String userText) { 209 | return Collections.emptyList(); 210 | } 211 | } 212 | 213 | /** 214 | * -proc:only is a standard option and should be supported. 215 | * see https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html 216 | */ 217 | @Test 218 | public void testCompileProcOnly() { 219 | AProcessor p = new AProcessor(); 220 | 221 | try { 222 | Reflect.compile( 223 | "p.D", 224 | "package p; public class D extends B {} class B {}", 225 | new CompileOptions().options("-proc:only").processors(p) 226 | ); 227 | 228 | fail("-proc:only does not produce compilation output"); 229 | } 230 | catch (ReflectException expected) { 231 | assertTrue(p.processed); 232 | } 233 | } 234 | 235 | @Test 236 | public void testProcess() { 237 | AProcessor p = new AProcessor(); 238 | Reflect.process( 239 | "p.D", 240 | "package p; public class D extends B {} class B {}", 241 | new CompileOptions().processors(p) 242 | ); 243 | 244 | assertTrue(p.processed); 245 | } 246 | } 247 | 248 | @interface A {} 249 | @interface B {} 250 | 251 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/CompileTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | 17 | 18 | import static org.junit.Assert.assertEquals; 19 | import static org.junit.Assert.assertTrue; 20 | 21 | import java.util.ArrayList; 22 | import java.util.Arrays; 23 | import java.util.function.Supplier; 24 | import java.util.stream.Collectors; 25 | import java.util.stream.Stream; 26 | 27 | import org.joor.Reflect; 28 | import org.joor.ReflectException; 29 | import org.joor.test.CompileTest.J; 30 | import org.junit.Ignore; 31 | import org.junit.Test; 32 | import org.junit.validator.TestClassValidator; 33 | 34 | /** 35 | * @author Lukas Eder 36 | */ 37 | public class CompileTest { 38 | 39 | @Test 40 | public void testCompileWithClasspathDependency() throws Exception { 41 | TestClassValidator v = Reflect.compile("org.joor.test.TestClassValidatorImplementation", 42 | "package org.joor.test; public class TestClassValidatorImplementation implements org.junit.validator.TestClassValidator {" 43 | + "public java.util.List validateTestClass(org.junit.runners.model.TestClass testClass) {" 44 | + "return new java.util.ArrayList<>();" 45 | + "}" 46 | + "}").create().get(); 47 | assertEquals(new ArrayList(), v.validateTestClass(null)); 48 | } 49 | 50 | @Test 51 | public void testCompileLocalInterfaceHierarchy() throws Exception { 52 | I i = Reflect.compile("org.joor.test.CompileTest1", "package org.joor.test; public class CompileTest1 implements org.joor.test.I {}").create().get(); 53 | assertEquals("I.m()", i.m()); 54 | 55 | J j = Reflect.compile("org.joor.test.CompileTest2", "package org.joor.test; public class CompileTest2 implements org.joor.test.CompileTest.J {}").create().get(); 56 | assertEquals("J.m()", j.m()); 57 | } 58 | 59 | @Test 60 | public void testCompileSamePackage() { 61 | Supplier supplier = Reflect.compile( 62 | "org.joor.test.CompileTest3", 63 | "package org.joor.test;\n" + 64 | "class CompileTest3 implements java.util.function.Supplier {\n" + 65 | " public String get() {\n" + 66 | " return \"Hello World!\";\n" + 67 | " }\n" + 68 | "}\n" 69 | ).create().get(); 70 | 71 | assertEquals("Hello World!", supplier.get()); 72 | } 73 | 74 | @Test 75 | public void testCompileDifferentPackage() { 76 | Supplier supplier = Reflect.compile( 77 | "com.example.CompileTestDifferentPackage", 78 | "package com.example;\n" + 79 | "class CompileTestDifferentPackage implements java.util.function.Supplier {\n" + 80 | " public String get() {\n" + 81 | " return \"Hello World!\";\n" + 82 | " }\n" + 83 | "}\n" 84 | ).create().get(); 85 | 86 | assertEquals("Hello World!", supplier.get()); 87 | } 88 | 89 | @Test 90 | public void testRecompileSameClassName() { 91 | 92 | // The class loader will cache the class name by default, so a new content shouldn't affect the type 93 | Object o1 = Reflect.compile( 94 | "org.joor.test.CompileSameClassName", 95 | "package org.joor.test;" + 96 | "class CompileSameClassName { public String toString() { return \"a\"; } }") 97 | .create() 98 | .get(); 99 | 100 | assertEquals("a", o1.toString()); 101 | Object o2 = Reflect.compile( 102 | "org.joor.test.CompileSameClassName", 103 | "package org.joor.test;" + 104 | "class CompileSameClassName { public String toString() { return \"b\"; } }") 105 | .create() 106 | .get(); 107 | 108 | assertEquals("a", o2.toString()); 109 | } 110 | 111 | @Test 112 | public void testCompileEnums() { 113 | Class> e = Reflect.compile( 114 | "org.joor.test.CompiledEnum", 115 | "package org.joor.test;" + 116 | "enum CompiledEnum { a, b, c }") 117 | .get(); 118 | 119 | assertEquals(Arrays.asList("a", "b", "c"), Stream.of(e.getEnumConstants()).map(Enum::name).collect(Collectors.toList())); 120 | } 121 | 122 | @Test 123 | public void testCompilationError() { 124 | try { 125 | Reflect.compile( 126 | "org.joor.test.CompilationError", 127 | "package org.joor.test;" + 128 | "class CompilationError { a }" 129 | ); 130 | } 131 | catch (ReflectException e) { 132 | assertTrue(e.getMessage(), e.getMessage().contains("Compilation error:")); 133 | } 134 | } 135 | 136 | interface J { 137 | default String m() { 138 | return "J.m()"; 139 | } 140 | } 141 | 142 | @Test 143 | public void testCompileNestedClass() { 144 | Class c = 145 | Reflect.compile( 146 | "org.joor.test.CompiledNestedClass", 147 | "package org.joor.test;" + 148 | "public class CompiledNestedClass {" + 149 | "public class Inner {" + 150 | "int foo() { return 42; }" + 151 | "}" + 152 | "Inner inner() { return new Inner(); }" + 153 | "}") 154 | .get(); 155 | 156 | int foo = Reflect.onClass(c).create().call("inner").call("foo").get(); 157 | assertEquals(42, foo); 158 | } 159 | 160 | @Test 161 | public void testCompileTopLevelClasses() { 162 | Class c = 163 | Reflect.compile( 164 | "org.joor.test.CompileTopLevelClasses", 165 | "package org.joor.test;" + 166 | "public class CompileTopLevelClasses {" + 167 | "Other other() { return new Other(); }" + 168 | "}" + 169 | "class Other {" + 170 | "int foo() { return 42; }" + 171 | "}") 172 | .get(); 173 | 174 | int foo = Reflect.onClass(c).create().call("other").call("foo").get(); 175 | assertEquals(42, foo); 176 | } 177 | 178 | @Test 179 | public void testClassLoadingOrder1() { 180 | Class a; 181 | 182 | a = Reflect.compile("p.A", "package p; public class A extends B {} class B {}").type(); 183 | assertEquals("p.A", a.getName()); 184 | assertEquals("p.B", a.getSuperclass().getName()); 185 | 186 | a = Reflect.compile("p.A", "package p; class B {} public class A extends B {}").type(); 187 | assertEquals("p.A", a.getName()); 188 | assertEquals("p.B", a.getSuperclass().getName()); 189 | } 190 | 191 | @Test 192 | public void testClassLoadingOrder2() { 193 | Class d; 194 | 195 | d = Reflect.compile("p.D", "package p; public class D extends B {} class B {}").type(); 196 | assertEquals("p.D", d.getName()); 197 | assertEquals("p.B", d.getSuperclass().getName()); 198 | 199 | d = Reflect.compile("p.D", "package p; class B {} public class D extends B {}").type(); 200 | assertEquals("p.D", d.getName()); 201 | assertEquals("p.B", d.getSuperclass().getName()); 202 | } 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | } 229 | 230 | interface I extends J { 231 | @Override 232 | default String m() { 233 | return "I.m()"; 234 | } 235 | } 236 | 237 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/InterfaceWithDefaultMethods.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | /** 17 | * @author Thomas Darimont 18 | */ 19 | public interface InterfaceWithDefaultMethods { 20 | 21 | 22 | default int returnAnInt() { 23 | return 42; 24 | } 25 | 26 | default int throwIllegalArgumentException() { 27 | throw new IllegalArgumentException("oh oh"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/PrivateConstructors.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | @SuppressWarnings("all") 17 | public class PrivateConstructors { 18 | 19 | public final String string; 20 | 21 | private PrivateConstructors() { 22 | this(null); 23 | } 24 | 25 | private PrivateConstructors(String string) { 26 | this.string = string; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/TestHierarchicalMethodsBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_BASE"; 19 | public static String PRIVATE_RESULT = "PRIVATE_BASE"; 20 | 21 | private int invisibleField1; 22 | private int invisibleField2; 23 | public int visibleField1; 24 | public int visibleField2; 25 | 26 | public String pub_base_method(int number) { 27 | return PUBLIC_RESULT; 28 | } 29 | public String pub_method(int number) { 30 | return PUBLIC_RESULT; 31 | } 32 | 33 | private String priv_method(int number) { 34 | return PRIVATE_RESULT; 35 | } 36 | 37 | private String very_priv_method() { 38 | return PRIVATE_RESULT; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/TestHierarchicalMethodsSubclass.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsSubclass extends TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_SUB"; 19 | public static String PRIVATE_RESULT = "PRIVATE_SUB"; 20 | 21 | // Both of these are hiding fields in the super type 22 | private int invisibleField2; 23 | public int visibleField2; 24 | 25 | private int invisibleField3; 26 | public int visibleField3; 27 | 28 | private String priv_method(int number) { 29 | return PRIVATE_RESULT; 30 | } 31 | 32 | private String pub_method(Integer number) { 33 | return PRIVATE_RESULT; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/TestPrivateStaticFinal.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test; 17 | 18 | /** 19 | * @author Lukas Eder 20 | */ 21 | @SuppressWarnings("deprecation") 22 | public class TestPrivateStaticFinal { 23 | private static final int I1 = new Integer(1); 24 | private static final Integer I2 = new Integer(1); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/MapContainer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | import java.util.HashMap; 17 | import java.util.Map; 18 | 19 | public class MapContainer { 20 | public Map map = new HashMap(); 21 | 22 | public void put(String name, String value) { 23 | map.put(name, value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/PartialStringAPI1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI1 { 20 | 21 | String substring(int beginIndex); 22 | String substring(int beginIndex, int endIndex); 23 | 24 | String substring(Integer beginIndex); 25 | String substring(Integer beginIndex, Integer endIndex); 26 | } 27 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/PartialStringAPI2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI2 { 20 | 21 | boolean contains(CharSequence string); 22 | } 23 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test1 { 20 | public static int S_INT1; 21 | public static Integer S_INT2; 22 | public int I_INT1; 23 | public Integer I_INT2; 24 | 25 | public static Test1 S_DATA; 26 | public Test1 I_DATA; 27 | } 28 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test10.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test10 { 20 | 21 | public final String s; 22 | public final Integer i; 23 | 24 | Test10(int i) { 25 | this(null, i); 26 | } 27 | 28 | Test10(String s) { 29 | this(s, null); 30 | } 31 | 32 | Test10(String s, int i) { 33 | this(s, (Integer) i); 34 | } 35 | 36 | Test10(String s, Integer i) { 37 | this.s = s; 38 | this.i = i; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test11.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test.interfaces; 17 | 18 | @SuppressWarnings("deprecation") 19 | public class Test11 { 20 | 21 | 22 | public static final int SF_INT1 = new Integer(0); 23 | public static final Integer SF_INT2 = new Integer(0); 24 | public final int F_INT1 = new Integer(0); 25 | public final Integer F_INT2 = new Integer(0); 26 | 27 | public static Test11 S_DATA; 28 | public Test11 I_DATA; 29 | } 30 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test2 { 20 | 21 | public final Object n; 22 | public final ConstructorType constructorType; 23 | 24 | public Test2() { 25 | this.n = null; 26 | this.constructorType = ConstructorType.NO_ARGS; 27 | } 28 | 29 | public Test2(Integer n) { 30 | this.n = n; 31 | this.constructorType = ConstructorType.INTEGER; 32 | } 33 | 34 | public Test2(Number n) { 35 | this.n = n; 36 | this.constructorType = ConstructorType.NUMBER; 37 | } 38 | 39 | public Test2(Object n) { 40 | this.n = n; 41 | this.constructorType = ConstructorType.OBJECT; 42 | } 43 | 44 | public static enum ConstructorType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test3.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test3 { 20 | 21 | public Object n; 22 | public MethodType methodType; 23 | 24 | public void method() { 25 | this.n = null; 26 | this.methodType = MethodType.NO_ARGS; 27 | } 28 | 29 | public void method(Integer n1) { 30 | this.n = n1; 31 | this.methodType = MethodType.INTEGER; 32 | } 33 | 34 | public void method(Number n1) { 35 | this.n = n1; 36 | this.methodType = MethodType.NUMBER; 37 | } 38 | 39 | public void method(Object n1) { 40 | this.n = n1; 41 | this.methodType = MethodType.OBJECT; 42 | } 43 | 44 | public static enum MethodType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test4.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test4 { 17 | 18 | public static void s_method() { 19 | } 20 | 21 | public void i_method() { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test6.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public interface Test6 { 17 | void setFoo(String s); 18 | void setBar(boolean b); 19 | void setBaz(String baz); 20 | void testIgnore(); 21 | 22 | String getFoo(); 23 | boolean isBar(); 24 | String getBaz(); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR-java-8/src/test/java/org/joor/test/interfaces/Test8.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test8 { 17 | 18 | private static void s_method() { 19 | } 20 | 21 | private void i_method() { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jOOR/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 4.0.0 6 | 7 | org.jooq 8 | joor 9 | 0.9.16-SNAPSHOT 10 | bundle 11 | 12 | jOOR 13 | jOOR is a recursive acronym that stands for jOOR Object Oriented Reflection. It is a simple wrapper for the java.lang.reflect package. 14 | https://github.com/jOOQ/jOOR 15 | 16 | 17 | 18 | Apache License, Version 2.0 19 | http://www.apache.org/licenses/LICENSE-2.0 20 | repo 21 | 22 | 23 | 24 | 25 | git@github.com:jOOQ/jOOR.git 26 | git@github.com:jOOQ/jOOR.git 27 | git@github.com:jOOQ/jOOR.git 28 | 29 | 30 | 31 | deploy 32 | ${project.artifactId}-${project.version} 33 | 34 | 35 | 36 | org.apache.maven.plugins 37 | maven-compiler-plugin 38 | 3.13.0 39 | 40 | true 41 | 512m 42 | 256m 43 | UTF-8 44 | 45 | 11 46 | 47 | 48 | 11 49 | 11 50 | true 51 | lines,vars,source 52 | 53 | 54 | 55 | 56 | org.apache.maven.plugins 57 | maven-resources-plugin 58 | 2.5 59 | 60 | UTF-8 61 | 62 | 63 | 64 | 65 | org.apache.maven.plugins 66 | maven-eclipse-plugin 67 | 2.8 68 | 69 | true 70 | 71 | 72 | 73 | 74 | org.apache.felix 75 | maven-bundle-plugin 76 | 3.5.0 77 | true 78 | 79 | 80 | 81 | 82 | 83 | 84 | release-oss 85 | 86 | 87 | 88 | 89 | sonatype-nexus-staging 90 | Nexus Release Repository 91 | https://oss.sonatype.org/service/local/staging/deploy/maven2/ 92 | 93 | 94 | 95 | 96 | 97 | 98 | org.apache.maven.plugins 99 | maven-source-plugin 100 | 3.2.1 101 | true 102 | 103 | 104 | attach-sources 105 | 106 | jar 107 | 108 | 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | org.apache.maven.plugins 118 | maven-javadoc-plugin 119 | 3.6.3 120 | true 121 | 122 | 123 | bundle-sources 124 | package 125 | 126 | jar 127 | 128 | 129 | 130 | 131 | 1024 132 | UTF-8 133 | protected 134 | true 135 | 136 | en 137 | 138 | 139 | -Xdoclint:none 140 | -Xdoclint:none 141 | 142 | 143 | 144 | 145 | 146 | org.apache.maven.plugins 147 | maven-resources-plugin 148 | 149 | 150 | copy-folder 151 | package 152 | 153 | copy-resources 154 | 155 | 156 | ${project.build.directory}/apidocs-ga 157 | 158 | 159 | false 160 | ${project.build.directory}/apidocs 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | com.google.code.maven-replacer-plugin 171 | replacer 172 | 1.5.3 173 | 174 | 175 | replace-apidocs-jar 176 | package 177 | 178 | replace 179 | 180 | 181 | 182 | true 183 | ${project.build.directory}/apidocs 184 | 185 | **/*.html 186 | 187 | 188 | 189 | ]]> 190 | 192 | 193 | 194 | ]]> 195 | 196 | 197 | 198 | 199 | 200 | 201 | replace-apidocs-ga 202 | package 203 | 204 | replace 205 | 206 | 207 | 208 | 209 | 210 | true 211 | ${project.build.directory}/apidocs-ga 212 | 213 | **/*.html 214 | 215 | 216 | 217 | ]]> 218 | 220 | 221 | 228 | 229 | ]]> 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | org.apache.maven.plugins 239 | maven-antrun-plugin 240 | 1.6 241 | 242 | 243 | repack 244 | package 245 | 246 | run 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | org.apache.maven.plugins 260 | maven-gpg-plugin 261 | 3.0.1 262 | 263 | 264 | sign-artifacts 265 | verify 266 | 267 | sign 268 | 269 | 270 | 271 | --pinentry-mode 272 | loopback 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | GitHub 285 | https://github.com/jOOQ/jOOR/issues 286 | 287 | 288 | 289 | 290 | Lukas Eder 291 | lukas.eder@gmail.com 292 | 293 | 294 | 295 | 296 | 297 | junit 298 | junit 299 | 4.13.1 300 | jar 301 | test 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /jOOR/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | /* [java-11] */ 2 | module org.jooq.joor { 3 | requires static transitive java.compiler; 4 | 5 | exports org.joor; 6 | } 7 | /* [/java-11] */ -------------------------------------------------------------------------------- /jOOR/src/main/java/org/joor/Compile.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | /* [java-8] */ 17 | 18 | import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE; 19 | 20 | import java.io.ByteArrayOutputStream; 21 | import java.io.File; 22 | import java.io.OutputStream; 23 | import java.io.StringWriter; 24 | import java.lang.invoke.MethodHandles; 25 | import java.lang.invoke.MethodHandles.Lookup; 26 | import java.net.URI; 27 | import java.net.URL; 28 | import java.net.URLClassLoader; 29 | import java.nio.charset.StandardCharsets; 30 | import java.util.ArrayDeque; 31 | import java.util.ArrayList; 32 | import java.util.Arrays; 33 | import java.util.Deque; 34 | import java.util.LinkedHashMap; 35 | import java.util.List; 36 | import java.util.Map; 37 | import java.util.Map.Entry; 38 | 39 | import javax.tools.FileObject; 40 | import javax.tools.ForwardingJavaFileManager; 41 | import javax.tools.JavaCompiler; 42 | import javax.tools.JavaCompiler.CompilationTask; 43 | import javax.tools.JavaFileManager; 44 | import javax.tools.SimpleJavaFileObject; 45 | import javax.tools.StandardJavaFileManager; 46 | import javax.tools.ToolProvider; 47 | 48 | 49 | /** 50 | * A utility that simplifies in-memory compilation of new classes. 51 | * 52 | * @author Lukas Eder 53 | */ 54 | class Compile { 55 | 56 | static Class compile(String className, String content, CompileOptions compileOptions) { 57 | return compile(className, content, compileOptions, true); 58 | } 59 | 60 | static Class compile(String className, String content, CompileOptions compileOptions, boolean expectResult) { 61 | Lookup lookup = MethodHandles.lookup(); 62 | ClassLoader cl = compileOptions.classLoader != null 63 | ? compileOptions.classLoader 64 | : lookup.lookupClass().getClassLoader(); 65 | 66 | try { 67 | return cl.loadClass(className); 68 | } 69 | catch (ClassNotFoundException ignore) { 70 | JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 71 | 72 | if (compiler == null) 73 | throw new ReflectException("No compiler was provided by ToolProvider.getSystemJavaCompiler(). Make sure the jdk.compiler module is available."); 74 | 75 | try { 76 | ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null)); 77 | 78 | List files = new ArrayList<>(); 79 | files.add(new CharSequenceJavaFileObject(className, content)); 80 | StringWriter out = new StringWriter(); 81 | 82 | List options = new ArrayList<>(compileOptions.options); 83 | if (!options.contains("-classpath")) { 84 | StringBuilder classpath = new StringBuilder(); 85 | String separator = System.getProperty("path.separator"); 86 | String cp = System.getProperty("java.class.path"); 87 | String mp = System.getProperty("jdk.module.path"); 88 | 89 | if (cp != null && !"".equals(cp)) 90 | classpath.append(cp); 91 | if (mp != null && !"".equals(mp)) 92 | classpath.append(mp); 93 | 94 | if (cl instanceof URLClassLoader) { 95 | for (URL url : ((URLClassLoader) cl).getURLs()) { 96 | if (classpath.length() > 0) 97 | classpath.append(separator); 98 | 99 | if ("file".equals(url.getProtocol())) 100 | classpath.append(new File(url.toURI())); 101 | } 102 | } 103 | 104 | options.addAll(Arrays.asList("-classpath", classpath.toString())); 105 | } 106 | 107 | CompilationTask task = compiler.getTask(out, fileManager, null, options, null, files); 108 | 109 | if (!compileOptions.processors.isEmpty()) 110 | task.setProcessors(compileOptions.processors); 111 | 112 | task.call(); 113 | 114 | if (fileManager.isEmpty()) { 115 | if (!expectResult) 116 | return null; 117 | 118 | throw new ReflectException("Compilation error: " + out); 119 | } 120 | 121 | Class result = null; 122 | 123 | // This works if we have private-access to the interfaces in the class hierarchy 124 | if (Reflect.CACHED_LOOKUP_CONSTRUCTOR != null) { 125 | result = fileManager.loadAndReturnMainClass(className, 126 | (name, bytes) -> Reflect.on(cl).call("defineClass", name, bytes, 0, bytes.length).get()); 127 | } 128 | /* [java-11] */ 129 | 130 | // Lookup.defineClass() has only been introduced in Java 9. It is 131 | // required to get private-access to interfaces in the class hierarchy 132 | else { 133 | 134 | // This method is called by client code from two levels up the current stack frame 135 | // We need a private-access lookup from the class in that stack frame in order to get 136 | // private-access to any local interfaces at that location. 137 | Class caller = StackWalker 138 | .getInstance(RETAIN_CLASS_REFERENCE) 139 | .walk(s -> s 140 | .skip(2) 141 | .findFirst() 142 | .get() 143 | .getDeclaringClass()); 144 | 145 | // If the compiled class is in the same package as the caller class, then 146 | // we can use the private-access Lookup of the caller class 147 | if (className.startsWith(caller.getPackageName() + ".") && 148 | 149 | // [#74] This heuristic is necessary to prevent classes in subpackages of the caller to be loaded 150 | // this way, as subpackages cannot access private content in super packages. 151 | // The heuristic will work only with classes that follow standard naming conventions. 152 | // A better implementation is difficult at this point. 153 | Character.isUpperCase(className.charAt(caller.getPackageName().length() + 1))) { 154 | Lookup privateLookup = MethodHandles.privateLookupIn(caller, lookup); 155 | result = fileManager.loadAndReturnMainClass(className, 156 | (name, bytes) -> privateLookup.defineClass(bytes)); 157 | } 158 | 159 | // Otherwise, use an arbitrary class loader. This approach doesn't allow for 160 | // loading private-access interfaces in the compiled class's type hierarchy 161 | else { 162 | ByteArrayClassLoader c = new ByteArrayClassLoader(fileManager.classes()); 163 | result = fileManager.loadAndReturnMainClass(className, 164 | (name, bytes) -> c.loadClass(name)); 165 | } 166 | } 167 | /* [/java-11] */ 168 | 169 | return result; 170 | } 171 | catch (ReflectException e) { 172 | throw e; 173 | } 174 | catch (Exception e) { 175 | throw new ReflectException("Error while compiling " + className, e); 176 | } 177 | } 178 | } 179 | 180 | /* [java-11] */ 181 | static final class ByteArrayClassLoader extends ClassLoader { 182 | private final Map classes; 183 | 184 | ByteArrayClassLoader(Map classes) { 185 | super(ByteArrayClassLoader.class.getClassLoader()); 186 | 187 | this.classes = classes; 188 | } 189 | 190 | @Override 191 | protected Class findClass(String name) throws ClassNotFoundException { 192 | byte[] bytes = classes.get(name); 193 | 194 | if (bytes == null) 195 | return super.findClass(name); 196 | else 197 | return defineClass(name, bytes, 0, bytes.length); 198 | } 199 | } 200 | /* [/java-11] */ 201 | 202 | static final class JavaFileObject extends SimpleJavaFileObject { 203 | final ByteArrayOutputStream os = new ByteArrayOutputStream(); 204 | 205 | JavaFileObject(String name, JavaFileObject.Kind kind) { 206 | super(URI.create("string:///" + name.replace('.', '/') + kind.extension), kind); 207 | } 208 | 209 | byte[] getBytes() { 210 | return os.toByteArray(); 211 | } 212 | 213 | @Override 214 | public OutputStream openOutputStream() { 215 | return os; 216 | } 217 | 218 | @Override 219 | public CharSequence getCharContent(boolean ignoreEncodingErrors) { 220 | return new String(os.toByteArray(), StandardCharsets.UTF_8); 221 | } 222 | } 223 | 224 | static final class ClassFileManager extends ForwardingJavaFileManager { 225 | private final Map fileObjectMap; 226 | private Map classes; 227 | 228 | ClassFileManager(StandardJavaFileManager standardManager) { 229 | super(standardManager); 230 | 231 | fileObjectMap = new LinkedHashMap<>(); 232 | } 233 | 234 | @Override 235 | public JavaFileObject getJavaFileForOutput( 236 | JavaFileManager.Location location, 237 | String className, 238 | JavaFileObject.Kind kind, 239 | FileObject sibling 240 | ) { 241 | JavaFileObject result = new JavaFileObject(className, kind); 242 | fileObjectMap.put(className, result); 243 | return result; 244 | } 245 | 246 | boolean isEmpty() { 247 | return fileObjectMap.isEmpty(); 248 | } 249 | 250 | Map classes() { 251 | if (classes == null) { 252 | classes = new LinkedHashMap<>(); 253 | 254 | for (Entry entry : fileObjectMap.entrySet()) 255 | classes.put(entry.getKey(), entry.getValue().getBytes()); 256 | } 257 | 258 | return classes; 259 | } 260 | 261 | Class loadAndReturnMainClass(String mainClassName, ThrowingBiFunction> definer) throws Exception { 262 | Class result = null; 263 | 264 | // [#117] We don't know the subclass hierarchy of the top level 265 | // classes in the compilation unit, and we can't find out 266 | // without either: 267 | // 268 | // - class loading them (which fails due to NoClassDefFoundError) 269 | // - using a library like ASM (which is a big and painful dependency) 270 | // 271 | // Simple workaround: try until it works, in O(n^2), where n 272 | // can be reasonably expected to be small. 273 | Deque> queue = new ArrayDeque<>(classes().entrySet()); 274 | int n1 = queue.size(); 275 | 276 | // Try at most n times 277 | for (int i1 = 0; i1 < n1 && !queue.isEmpty(); i1++) { 278 | int n2 = queue.size(); 279 | 280 | for (int i2 = 0; i2 < n2; i2++) { 281 | Entry entry = queue.pop(); 282 | 283 | try { 284 | Class c = definer.apply(entry.getKey(), entry.getValue()); 285 | 286 | if (mainClassName.equals(entry.getKey())) 287 | result = c; 288 | } 289 | catch (ReflectException e) { 290 | queue.offer(entry); 291 | } 292 | } 293 | } 294 | 295 | return result; 296 | } 297 | } 298 | 299 | @FunctionalInterface 300 | interface ThrowingBiFunction { 301 | R apply(T t, U u) throws Exception; 302 | } 303 | 304 | static final class CharSequenceJavaFileObject extends SimpleJavaFileObject { 305 | final CharSequence content; 306 | 307 | public CharSequenceJavaFileObject(String className, CharSequence content) { 308 | super(URI.create("string:///" + className.replace('.', '/') + JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE); 309 | this.content = content; 310 | } 311 | 312 | @Override 313 | public CharSequence getCharContent(boolean ignoreEncodingErrors) { 314 | return content; 315 | } 316 | } 317 | } 318 | /* [/java-8] */ 319 | -------------------------------------------------------------------------------- /jOOR/src/main/java/org/joor/CompileOptions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | /* [java-8] */ 17 | 18 | import java.util.Arrays; 19 | 20 | import java.util.Collections; 21 | import java.util.List; 22 | 23 | import javax.annotation.processing.Processor; 24 | 25 | /** 26 | * @author Lukas Eder 27 | */ 28 | public final class CompileOptions { 29 | 30 | final List processors; 31 | final List options; 32 | final ClassLoader classLoader; 33 | 34 | public CompileOptions() { 35 | this( 36 | Collections.emptyList(), 37 | Collections.emptyList(), 38 | null 39 | ); 40 | } 41 | 42 | private CompileOptions( 43 | List processors, 44 | List options, 45 | ClassLoader classLoader 46 | ) { 47 | this.processors = processors; 48 | this.options = options; 49 | this.classLoader = classLoader; 50 | } 51 | 52 | public final CompileOptions processors(Processor... newProcessors) { 53 | return processors(Arrays.asList(newProcessors)); 54 | } 55 | 56 | public final CompileOptions processors(List newProcessors) { 57 | return new CompileOptions(newProcessors, options, classLoader); 58 | } 59 | 60 | public final CompileOptions options(String... newOptions) { 61 | return options(Arrays.asList(newOptions)); 62 | } 63 | 64 | public final CompileOptions options(List newOptions) { 65 | return new CompileOptions(processors, newOptions, classLoader); 66 | } 67 | 68 | final boolean hasOption(String opt) { 69 | for (String option : options) 70 | if (option.equalsIgnoreCase(opt)) 71 | return true; 72 | 73 | return false; 74 | } 75 | 76 | public final CompileOptions classLoader(ClassLoader newClassLoader) { 77 | return new CompileOptions(processors, options, newClassLoader); 78 | } 79 | } 80 | /* [/java-8] */ 81 | -------------------------------------------------------------------------------- /jOOR/src/main/java/org/joor/ReflectException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor; 15 | 16 | import java.lang.reflect.InvocationTargetException; 17 | 18 | /** 19 | * A unchecked wrapper for any of Java's checked reflection exceptions: 20 | *

21 | * These exceptions are 22 | *

    23 | *
  • {@link ClassNotFoundException}
  • 24 | *
  • {@link IllegalAccessException}
  • 25 | *
  • {@link IllegalArgumentException}
  • 26 | *
  • {@link InstantiationException}
  • 27 | *
  • {@link InvocationTargetException}
  • 28 | *
  • {@link NoSuchMethodException}
  • 29 | *
  • {@link NoSuchFieldException}
  • 30 | *
  • {@link SecurityException}
  • 31 | *
32 | * 33 | * @author Lukas Eder 34 | */ 35 | public class ReflectException extends RuntimeException { 36 | 37 | /** 38 | * Generated UID 39 | */ 40 | private static final long serialVersionUID = -6213149635297151442L; 41 | 42 | public ReflectException(String message) { 43 | super(message); 44 | } 45 | 46 | public ReflectException(String message, Throwable cause) { 47 | super(message, cause); 48 | } 49 | 50 | public ReflectException() { 51 | super(); 52 | } 53 | 54 | public ReflectException(Throwable cause) { 55 | super(cause); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /jOOR/src/main/resources/META-INF/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. -------------------------------------------------------------------------------- /jOOR/src/main/resources/META-INF/README.txt: -------------------------------------------------------------------------------- 1 | Thanks for downloading jOOR. 2 | Please visit http://code.google.com/p/joor/ for more information. -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/CompileOptionsTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | /* [java-8] */ 17 | 18 | import static org.junit.Assert.assertEquals; 19 | import static org.junit.Assert.assertFalse; 20 | import static org.junit.Assert.assertNull; 21 | import static org.junit.Assert.assertTrue; 22 | import static org.junit.Assert.fail; 23 | 24 | import java.io.Serializable; 25 | import java.util.Collections; 26 | import java.util.Set; 27 | import java.util.concurrent.atomic.AtomicBoolean; 28 | 29 | import javax.annotation.processing.Completion; 30 | import javax.annotation.processing.ProcessingEnvironment; 31 | import javax.annotation.processing.Processor; 32 | import javax.annotation.processing.RoundEnvironment; 33 | import javax.lang.model.SourceVersion; 34 | import javax.lang.model.element.AnnotationMirror; 35 | import javax.lang.model.element.Element; 36 | import javax.lang.model.element.ExecutableElement; 37 | import javax.lang.model.element.TypeElement; 38 | 39 | import org.joor.CompileOptions; 40 | import org.joor.Reflect; 41 | import org.joor.ReflectException; 42 | import org.junit.Test; 43 | 44 | /** 45 | * @author Lukas Eder 46 | */ 47 | public class CompileOptionsTest { 48 | 49 | @Test 50 | public void testCompileWithCustomClassLoader() throws Exception { 51 | AtomicBoolean called = new AtomicBoolean(); 52 | CompileOptions co = new CompileOptions().classLoader(new ClassLoader() { 53 | 54 | protected Class findClass(String name) { 55 | called.set(true); 56 | return Object.class; 57 | } 58 | 59 | public Class loadClass(String name) { 60 | called.set(true); 61 | return Object.class; 62 | } 63 | }); 64 | 65 | String className = "com.example.CompileWithCustomClassLoader"; 66 | String classCode = 67 | "package com.example;\n" + 68 | "class CompileWithCustomClassLoader implements java.io.Serializable {}\n"; 69 | 70 | Object o1 = Reflect.compile(className, classCode).create().get(); 71 | assertEquals(className, o1.getClass().getName()); 72 | assertTrue(o1 instanceof Serializable); 73 | 74 | Object o2 = Reflect.compile(className, classCode, co).create().get(); 75 | assertTrue(called.get()); 76 | assertEquals("java.lang.Object", o2.getClass().getName()); 77 | assertFalse(o2 instanceof Serializable); 78 | } 79 | @Test 80 | public void testCompileWithExtraOptions() { 81 | assertEquals("org.joor.test.Source7OK", Reflect.compile( 82 | "org.joor.test.Source7OK", 83 | "package org.joor.test; " 84 | + "public class Source7OK {" 85 | + "}", 86 | new CompileOptions().options("-source", "7") 87 | ).type().getName()); 88 | 89 | try { 90 | Reflect.compile( 91 | "org.joor.test.Source7NOK", 92 | "package org.joor.test; " 93 | + "public interface Source7NOK {" 94 | + " default void m() {}" 95 | + "}", 96 | new CompileOptions().options("-source", "7") 97 | ).type(); 98 | 99 | fail("Class should not compile with source level 7"); 100 | } 101 | catch (ReflectException expected) {} 102 | 103 | assertEquals("org.joor.test.Source8OK", Reflect.compile( 104 | "org.joor.test.Source8OK", 105 | "package org.joor.test; " 106 | + "public interface Source8OK {" 107 | + " default void m() {}" 108 | + "}", 109 | new CompileOptions().options("-source", "8") 110 | ).type().getName()); 111 | 112 | try { 113 | Reflect.compile( 114 | "org.joor.test.Source8NOK", 115 | "package org.joor.test; " 116 | + "public interface Source8NOK {" 117 | + " private void m() {}" 118 | + "}", 119 | new CompileOptions().options("-source", "8") 120 | ).create().get(); 121 | 122 | fail("Class should not compile with source level 8"); 123 | } 124 | catch (ReflectException expected) {} 125 | 126 | try { 127 | Reflect.compile( 128 | "org.joor.test.Invalid", 129 | "package org.joor.test; " 130 | + "public class Invalid {" 131 | + "}", 132 | new CompileOptions().options("-invalidflag") 133 | ); 134 | 135 | fail("Expected ReflectException for -invalidflag"); 136 | } 137 | catch (ReflectException expected) { 138 | assertTrue(expected.getCause() instanceof IllegalArgumentException); 139 | } 140 | } 141 | 142 | @Test 143 | public void testCompileWithAnnotationProcessors() throws Exception { 144 | AProcessor p = new AProcessor(); 145 | 146 | try { 147 | Reflect.compile( 148 | "org.joor.test.FailAnnotationProcessing", 149 | "package org.joor.test; " 150 | + "@A " 151 | + "public class FailAnnotationProcessing {" 152 | + "}", 153 | new CompileOptions().processors(p) 154 | ).create().get(); 155 | 156 | fail("Expected ReflectException for bad annotation"); 157 | } 158 | catch (ReflectException expected) { 159 | assertFalse(p.processed); 160 | } 161 | 162 | Reflect.compile( 163 | "org.joor.test.SucceedAnnotationProcessing", 164 | "package org.joor.test; " 165 | + "@A @B " 166 | + "public class SucceedAnnotationProcessing {" 167 | + "}", 168 | new CompileOptions().processors(p) 169 | ).create().get(); 170 | assertTrue(p.processed); 171 | } 172 | 173 | static class AProcessor implements Processor { 174 | boolean processed; 175 | 176 | @Override 177 | public Set getSupportedOptions() { 178 | return Collections.emptySet(); 179 | } 180 | 181 | @Override 182 | public Set getSupportedAnnotationTypes() { 183 | return Collections.singleton("*"); 184 | } 185 | 186 | @Override 187 | public SourceVersion getSupportedSourceVersion() { 188 | return SourceVersion.RELEASE_8; 189 | } 190 | 191 | @Override 192 | public void init(ProcessingEnvironment processingEnv) { 193 | } 194 | 195 | @Override 196 | public boolean process(Set annotations, RoundEnvironment roundEnv) { 197 | for (TypeElement e1 : annotations) 198 | if (e1.getQualifiedName().contentEquals(A.class.getName())) 199 | for (Element e2 : roundEnv.getElementsAnnotatedWith(e1)) 200 | if (e2.getAnnotation(B.class) == null) 201 | throw new RuntimeException("Annotation A must be accompanied by annotation B"); 202 | 203 | this.processed = true; 204 | return false; 205 | } 206 | 207 | @Override 208 | public Iterable getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, String userText) { 209 | return Collections.emptyList(); 210 | } 211 | } 212 | 213 | /** 214 | * -proc:only is a standard option and should be supported. 215 | * see https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html 216 | */ 217 | @Test 218 | public void testCompileProcOnly() { 219 | AProcessor p = new AProcessor(); 220 | 221 | try { 222 | Reflect.compile( 223 | "p.D", 224 | "package p; public class D extends B {} class B {}", 225 | new CompileOptions().options("-proc:only").processors(p) 226 | ); 227 | 228 | fail("-proc:only does not produce compilation output"); 229 | } 230 | catch (ReflectException expected) { 231 | assertTrue(p.processed); 232 | } 233 | } 234 | 235 | @Test 236 | public void testProcess() { 237 | AProcessor p = new AProcessor(); 238 | Reflect.process( 239 | "p.D", 240 | "package p; public class D extends B {} class B {}", 241 | new CompileOptions().processors(p) 242 | ); 243 | 244 | assertTrue(p.processed); 245 | } 246 | } 247 | 248 | @interface A {} 249 | @interface B {} 250 | 251 | /* [/java-8] */ -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/CompileTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | /* [java-8] */ 17 | 18 | import static org.junit.Assert.assertEquals; 19 | import static org.junit.Assert.assertTrue; 20 | 21 | import java.util.ArrayList; 22 | import java.util.Arrays; 23 | import java.util.function.Supplier; 24 | import java.util.stream.Collectors; 25 | import java.util.stream.Stream; 26 | 27 | import org.joor.Reflect; 28 | import org.joor.ReflectException; 29 | import org.joor.test.CompileTest.J; 30 | import org.junit.Ignore; 31 | import org.junit.Test; 32 | import org.junit.validator.TestClassValidator; 33 | 34 | /** 35 | * @author Lukas Eder 36 | */ 37 | public class CompileTest { 38 | 39 | @Test 40 | public void testCompileWithClasspathDependency() throws Exception { 41 | TestClassValidator v = Reflect.compile("org.joor.test.TestClassValidatorImplementation", 42 | "package org.joor.test; public class TestClassValidatorImplementation implements org.junit.validator.TestClassValidator {" 43 | + "public java.util.List validateTestClass(org.junit.runners.model.TestClass testClass) {" 44 | + "return new java.util.ArrayList<>();" 45 | + "}" 46 | + "}").create().get(); 47 | assertEquals(new ArrayList(), v.validateTestClass(null)); 48 | } 49 | 50 | @Test /* [java-11] */ (expected = Throwable.class) // [#77] /* [/java-11] */ 51 | public void testCompileLocalInterfaceHierarchy() throws Exception { 52 | I i = Reflect.compile("org.joor.test.CompileTest1", "package org.joor.test; public class CompileTest1 implements org.joor.test.I {}").create().get(); 53 | assertEquals("I.m()", i.m()); 54 | 55 | J j = Reflect.compile("org.joor.test.CompileTest2", "package org.joor.test; public class CompileTest2 implements org.joor.test.CompileTest.J {}").create().get(); 56 | assertEquals("J.m()", j.m()); 57 | } 58 | 59 | @Test 60 | public void testCompileSamePackage() { 61 | Supplier supplier = Reflect.compile( 62 | "org.joor.test.CompileTest3", 63 | "package org.joor.test;\n" + 64 | "class CompileTest3 implements java.util.function.Supplier {\n" + 65 | " public String get() {\n" + 66 | " return \"Hello World!\";\n" + 67 | " }\n" + 68 | "}\n" 69 | ).create().get(); 70 | 71 | assertEquals("Hello World!", supplier.get()); 72 | } 73 | 74 | @Test 75 | public void testCompileDifferentPackage() { 76 | Supplier supplier = Reflect.compile( 77 | "com.example.CompileTestDifferentPackage", 78 | "package com.example;\n" + 79 | "class CompileTestDifferentPackage implements java.util.function.Supplier {\n" + 80 | " public String get() {\n" + 81 | " return \"Hello World!\";\n" + 82 | " }\n" + 83 | "}\n" 84 | ).create().get(); 85 | 86 | assertEquals("Hello World!", supplier.get()); 87 | } 88 | 89 | @Test/* [java-11] */ (expected = Throwable.class) // [#76] /* [/java-11] */ 90 | public void testRecompileSameClassName() { 91 | 92 | // The class loader will cache the class name by default, so a new content shouldn't affect the type 93 | Object o1 = Reflect.compile( 94 | "org.joor.test.CompileSameClassName", 95 | "package org.joor.test;" + 96 | "class CompileSameClassName { public String toString() { return \"a\"; } }") 97 | .create() 98 | .get(); 99 | 100 | assertEquals("a", o1.toString()); 101 | Object o2 = Reflect.compile( 102 | "org.joor.test.CompileSameClassName", 103 | "package org.joor.test;" + 104 | "class CompileSameClassName { public String toString() { return \"b\"; } }") 105 | .create() 106 | .get(); 107 | 108 | assertEquals("a", o2.toString()); 109 | } 110 | 111 | @Test 112 | public void testCompileEnums() { 113 | Class> e = Reflect.compile( 114 | "org.joor.test.CompiledEnum", 115 | "package org.joor.test;" + 116 | "enum CompiledEnum { a, b, c }") 117 | .get(); 118 | 119 | assertEquals(Arrays.asList("a", "b", "c"), Stream.of(e.getEnumConstants()).map(Enum::name).collect(Collectors.toList())); 120 | } 121 | 122 | @Test 123 | public void testCompilationError() { 124 | try { 125 | Reflect.compile( 126 | "org.joor.test.CompilationError", 127 | "package org.joor.test;" + 128 | "class CompilationError { a }" 129 | ); 130 | } 131 | catch (ReflectException e) { 132 | assertTrue(e.getMessage(), e.getMessage().contains("Compilation error:")); 133 | } 134 | } 135 | 136 | interface J { 137 | default String m() { 138 | return "J.m()"; 139 | } 140 | } 141 | 142 | @Test 143 | public void testCompileNestedClass() { 144 | Class c = 145 | Reflect.compile( 146 | "org.joor.test.CompiledNestedClass", 147 | "package org.joor.test;" + 148 | "public class CompiledNestedClass {" + 149 | "public class Inner {" + 150 | "int foo() { return 42; }" + 151 | "}" + 152 | "Inner inner() { return new Inner(); }" + 153 | "}") 154 | .get(); 155 | 156 | int foo = Reflect.onClass(c).create().call("inner").call("foo").get(); 157 | assertEquals(42, foo); 158 | } 159 | 160 | @Test 161 | public void testCompileTopLevelClasses() { 162 | Class c = 163 | Reflect.compile( 164 | "org.joor.test.CompileTopLevelClasses", 165 | "package org.joor.test;" + 166 | "public class CompileTopLevelClasses {" + 167 | "Other other() { return new Other(); }" + 168 | "}" + 169 | "class Other {" + 170 | "int foo() { return 42; }" + 171 | "}") 172 | .get(); 173 | 174 | int foo = Reflect.onClass(c).create().call("other").call("foo").get(); 175 | assertEquals(42, foo); 176 | } 177 | 178 | @Test 179 | public void testClassLoadingOrder1() { 180 | Class a; 181 | 182 | a = Reflect.compile("p.A", "package p; public class A extends B {} class B {}").type(); 183 | assertEquals("p.A", a.getName()); 184 | assertEquals("p.B", a.getSuperclass().getName()); 185 | 186 | a = Reflect.compile("p.A", "package p; class B {} public class A extends B {}").type(); 187 | assertEquals("p.A", a.getName()); 188 | assertEquals("p.B", a.getSuperclass().getName()); 189 | } 190 | 191 | @Test 192 | public void testClassLoadingOrder2() { 193 | Class d; 194 | 195 | d = Reflect.compile("p.D", "package p; public class D extends B {} class B {}").type(); 196 | assertEquals("p.D", d.getName()); 197 | assertEquals("p.B", d.getSuperclass().getName()); 198 | 199 | d = Reflect.compile("p.D", "package p; class B {} public class D extends B {}").type(); 200 | assertEquals("p.D", d.getName()); 201 | assertEquals("p.B", d.getSuperclass().getName()); 202 | } 203 | 204 | /* [java-11] */ 205 | 206 | // This test seems to fail in Java 8. p.B doesn't correctly extend p.C 207 | @Test 208 | public void testClassLoadingOrder3() { 209 | Class a = Reflect.compile("p.A", "package p; " 210 | + "public class A extends B {} " 211 | + "class B extends C {} " 212 | + "class C implements D {} " 213 | + "interface D extends E {} " 214 | + "interface E {}").type(); 215 | 216 | Class b = a.getSuperclass(); 217 | Class c = b.getSuperclass(); 218 | assertEquals("p.A", a.getName()); 219 | assertEquals("p.B", b.getName()); 220 | assertEquals("p.C", c.getName()); 221 | assertEquals(1, c.getInterfaces().length); 222 | assertEquals("p.D", c.getInterfaces()[0].getName()); 223 | assertEquals(1, c.getInterfaces()[0].getInterfaces().length); 224 | assertEquals("p.E", c.getInterfaces()[0].getInterfaces()[0].getName()); 225 | } 226 | 227 | /* [/java-11] */ 228 | } 229 | 230 | interface I extends J { 231 | @Override 232 | default String m() { 233 | return "I.m()"; 234 | } 235 | } 236 | 237 | /* [/java-8] */ -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/InterfaceWithDefaultMethods.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | /** 17 | * @author Thomas Darimont 18 | */ 19 | public interface InterfaceWithDefaultMethods { 20 | 21 | /* [java-8] */ 22 | default int returnAnInt() { 23 | return 42; 24 | } 25 | 26 | default int throwIllegalArgumentException() { 27 | throw new IllegalArgumentException("oh oh"); 28 | } 29 | /* [/java-8] */ 30 | } 31 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/PrivateConstructors.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | @SuppressWarnings("all") 17 | public class PrivateConstructors { 18 | 19 | public final String string; 20 | 21 | private PrivateConstructors() { 22 | this(null); 23 | } 24 | 25 | private PrivateConstructors(String string) { 26 | this.string = string; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/TestHierarchicalMethodsBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_BASE"; 19 | public static String PRIVATE_RESULT = "PRIVATE_BASE"; 20 | 21 | private int invisibleField1; 22 | private int invisibleField2; 23 | public int visibleField1; 24 | public int visibleField2; 25 | 26 | public String pub_base_method(int number) { 27 | return PUBLIC_RESULT; 28 | } 29 | public String pub_method(int number) { 30 | return PUBLIC_RESULT; 31 | } 32 | 33 | private String priv_method(int number) { 34 | return PRIVATE_RESULT; 35 | } 36 | 37 | private String very_priv_method() { 38 | return PRIVATE_RESULT; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/TestHierarchicalMethodsSubclass.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test; 15 | 16 | public class TestHierarchicalMethodsSubclass extends TestHierarchicalMethodsBase { 17 | 18 | public static String PUBLIC_RESULT = "PUBLIC_SUB"; 19 | public static String PRIVATE_RESULT = "PRIVATE_SUB"; 20 | 21 | // Both of these are hiding fields in the super type 22 | private int invisibleField2; 23 | public int visibleField2; 24 | 25 | private int invisibleField3; 26 | public int visibleField3; 27 | 28 | private String priv_method(int number) { 29 | return PRIVATE_RESULT; 30 | } 31 | 32 | private String pub_method(Integer number) { 33 | return PRIVATE_RESULT; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/TestPrivateStaticFinal.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test; 17 | 18 | /** 19 | * @author Lukas Eder 20 | */ 21 | @SuppressWarnings("deprecation") 22 | public class TestPrivateStaticFinal { 23 | private static final int I1 = new Integer(1); 24 | private static final Integer I2 = new Integer(1); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/MapContainer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | import java.util.HashMap; 17 | import java.util.Map; 18 | 19 | public class MapContainer { 20 | public Map map = new HashMap(); 21 | 22 | public void put(String name, String value) { 23 | map.put(name, value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/PartialStringAPI1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI1 { 20 | 21 | String substring(int beginIndex); 22 | String substring(int beginIndex, int endIndex); 23 | 24 | String substring(Integer beginIndex); 25 | String substring(Integer beginIndex, Integer endIndex); 26 | } 27 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/PartialStringAPI2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public interface PartialStringAPI2 { 20 | 21 | boolean contains(CharSequence string); 22 | } 23 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test1 { 20 | public static int S_INT1; 21 | public static Integer S_INT2; 22 | public int I_INT1; 23 | public Integer I_INT2; 24 | 25 | public static Test1 S_DATA; 26 | public Test1 I_DATA; 27 | } 28 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test10.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test10 { 20 | 21 | public final String s; 22 | public final Integer i; 23 | 24 | Test10(int i) { 25 | this(null, i); 26 | } 27 | 28 | Test10(String s) { 29 | this(s, null); 30 | } 31 | 32 | Test10(String s, int i) { 33 | this(s, (Integer) i); 34 | } 35 | 36 | Test10(String s, Integer i) { 37 | this.s = s; 38 | this.i = i; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test11.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2011-2016, Data Geekery GmbH (http://www.datageekery.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.joor.test.interfaces; 17 | 18 | @SuppressWarnings("deprecation") 19 | public class Test11 { 20 | 21 | 22 | public static final int SF_INT1 = new Integer(0); 23 | public static final Integer SF_INT2 = new Integer(0); 24 | public final int F_INT1 = new Integer(0); 25 | public final Integer F_INT2 = new Integer(0); 26 | 27 | public static Test11 S_DATA; 28 | public Test11 I_DATA; 29 | } 30 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test2 { 20 | 21 | public final Object n; 22 | public final ConstructorType constructorType; 23 | 24 | public Test2() { 25 | this.n = null; 26 | this.constructorType = ConstructorType.NO_ARGS; 27 | } 28 | 29 | public Test2(Integer n) { 30 | this.n = n; 31 | this.constructorType = ConstructorType.INTEGER; 32 | } 33 | 34 | public Test2(Number n) { 35 | this.n = n; 36 | this.constructorType = ConstructorType.NUMBER; 37 | } 38 | 39 | public Test2(Object n) { 40 | this.n = n; 41 | this.constructorType = ConstructorType.OBJECT; 42 | } 43 | 44 | public static enum ConstructorType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test3.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | /** 17 | * @author Lukas Eder 18 | */ 19 | public class Test3 { 20 | 21 | public Object n; 22 | public MethodType methodType; 23 | 24 | public void method() { 25 | this.n = null; 26 | this.methodType = MethodType.NO_ARGS; 27 | } 28 | 29 | public void method(Integer n1) { 30 | this.n = n1; 31 | this.methodType = MethodType.INTEGER; 32 | } 33 | 34 | public void method(Number n1) { 35 | this.n = n1; 36 | this.methodType = MethodType.NUMBER; 37 | } 38 | 39 | public void method(Object n1) { 40 | this.n = n1; 41 | this.methodType = MethodType.OBJECT; 42 | } 43 | 44 | public static enum MethodType { 45 | NO_ARGS, 46 | INTEGER, 47 | NUMBER, 48 | OBJECT 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test4.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test4 { 17 | 18 | public static void s_method() { 19 | } 20 | 21 | public void i_method() { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test6.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public interface Test6 { 17 | void setFoo(String s); 18 | void setBar(boolean b); 19 | void setBaz(String baz); 20 | void testIgnore(); 21 | 22 | String getFoo(); 23 | boolean isBar(); 24 | String getBaz(); 25 | } 26 | -------------------------------------------------------------------------------- /jOOR/src/test/java/org/joor/test/interfaces/Test8.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package org.joor.test.interfaces; 15 | 16 | public class Test8 { 17 | 18 | private static void s_method() { 19 | } 20 | 21 | private void i_method() { 22 | } 23 | } 24 | --------------------------------------------------------------------------------