Skip to content

Commit

Permalink
Add addLambdaMemberFilter method
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-xm committed Apr 27, 2019
1 parent f5e9763 commit cf0c849
Showing 1 changed file with 29 additions and 7 deletions.
36 changes: 29 additions & 7 deletions src/main/java/net/jodah/typetools/TypeResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,8 @@
import java.lang.reflect.WildcardType;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.*;
import java.util.function.Predicate;

import sun.misc.Unsafe;

Expand All @@ -57,6 +54,7 @@ public final class TypeResolver {
private static final Map<String, Method> OBJECT_METHODS = new HashMap<String, Method>();
private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPERS;
private static final Double JAVA_VERSION;
private static final List<Predicate<Member>> lambdaMemberFilters = new ArrayList<>();

static {
JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version", "0"));
Expand Down Expand Up @@ -373,6 +371,17 @@ public static Class<?> resolveRawClass(Type genericType, Class<?> subType) {
return resolveRawClass(genericType, subType, null);
}

/**
* Using some low-level instruction technology may add some members into the constant pool. The generated members
* could make {@link TypeResolver} to return a wrong type. To avoid this, use {@code addLambdaMemberFilter} to
* add a custom lambda member filter to skip wrong members.
*
* @param lambdaMemberFilter to add
*/
public static synchronized void addLambdaMemberFilter(Predicate<Member> lambdaMemberFilter) {
lambdaMemberFilters.add(lambdaMemberFilter);
}

private static Class<?> resolveRawClass(Type genericType, Class<?> subType, Class<?> functionalInterface) {
if (genericType instanceof Class) {
return (Class<?>) genericType;
Expand Down Expand Up @@ -700,10 +709,11 @@ private static Member getMemberRef(Class<?> type) {
if (member == null
|| (member instanceof Constructor
&& member.getDeclaringClass().getName().equals("java.lang.invoke.SerializedLambda"))
// Skip member generated by jrebel
|| member.getDeclaringClass().getName().startsWith("com.zeroturnaround.jrebelbase.facade.")
|| member.getDeclaringClass().isAssignableFrom(type))
continue;
if (testAllLambdaMemberFilters(member)) {
continue;
}

result = member;

Expand All @@ -715,6 +725,18 @@ private static Member getMemberRef(Class<?> type) {
return result;
}

/**
* test member by custom lambda member filters, using AND operator.
*/
private static boolean testAllLambdaMemberFilters(Member member) {
for (Predicate<Member> lambdaMemberFilter : lambdaMemberFilters) {
if (lambdaMemberFilter.test(member)) {
return true;
}
}
return false;
}

private static boolean isAutoBoxingMethod(Method method) {
Class<?>[] parameters = method.getParameterTypes();
return method.getName().equals("valueOf") && parameters.length == 1 && parameters[0].isPrimitive()
Expand Down

0 comments on commit cf0c849

Please sign in to comment.