You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/06/19 07:00:29 UTC
[groovy] branch danielsun/tweak-build updated: Cache lookup for
groovy object
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch danielsun/tweak-build
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/danielsun/tweak-build by this push:
new a60d4ea Cache lookup for groovy object
a60d4ea is described below
commit a60d4ea46a483b38b01bd6667da9ab257e3d9ab7
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Jun 19 15:00:15 2021 +0800
Cache lookup for groovy object
---
.../org/apache/groovy/lang/GroovyObjectHelper.java | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java b/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
index 88a4e23..9a60489 100644
--- a/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
+++ b/src/main/java/org/apache/groovy/lang/GroovyObjectHelper.java
@@ -25,6 +25,7 @@ import java.lang.invoke.MethodHandles.Lookup;
import java.lang.invoke.MethodType;
import java.lang.reflect.Modifier;
import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Helper for {@link groovy.lang.GroovyObject}
@@ -40,6 +41,17 @@ public class GroovyObjectHelper {
* @since 4.0.0
*/
public static Optional<Lookup> lookup(GroovyObject groovyObject) {
+ AtomicReference<Lookup> lookupAtomicRef = LOOKUP_MAP.get(groovyObject.getClass());
+ Lookup lookup = lookupAtomicRef.get();
+ if (null != lookup) return Optional.of(lookup);
+
+ lookup = doLookup(groovyObject);
+ if (null != lookup) lookupAtomicRef.set(lookup);
+
+ return Optional.ofNullable(lookup);
+ }
+
+ private static Lookup doLookup(GroovyObject groovyObject) {
MethodHandles.Lookup lookup;
try {
final Class<? extends GroovyObject> groovyObjectClass = groovyObject.getClass();
@@ -58,9 +70,15 @@ public class GroovyObjectHelper {
lookup = null;
}
- return Optional.ofNullable(lookup);
+ return lookup;
}
private GroovyObjectHelper() {}
+ private static final ClassValue<AtomicReference<Lookup>> LOOKUP_MAP = new ClassValue<AtomicReference<Lookup>>() {
+ @Override
+ protected AtomicReference<Lookup> computeValue(Class<?> type) {
+ return new AtomicReference<>();
+ }
+ };
private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
}