diff --git a/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/util/ReflectionHack.java b/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/util/ReflectionHack.java index 53015780..eb0f9e97 100644 --- a/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/util/ReflectionHack.java +++ b/blackbird/src/main/java/com/fasterxml/jackson/module/blackbird/util/ReflectionHack.java @@ -52,7 +52,13 @@ private static MethodHandle init() { } public static Lookup privateLookupIn(Class lookup, Lookup orig) { - return Unchecked.supplier(() -> (Lookup) FACTORY.invokeExact(lookup, orig)).get(); + try { + return (Lookup) FACTORY.invokeExact(lookup, orig); + } catch (ReflectiveOperationException e) { + return orig; + } catch (Throwable t) { + throw Sneaky.throwAnyway(t); + } } } diff --git a/blackbird/src/test/java/com/fasterxml/jackson/module/blackbird/TestAccessFallback.java b/blackbird/src/test/java/com/fasterxml/jackson/module/blackbird/TestAccessFallback.java index 52bb280b..8246975e 100644 --- a/blackbird/src/test/java/com/fasterxml/jackson/module/blackbird/TestAccessFallback.java +++ b/blackbird/src/test/java/com/fasterxml/jackson/module/blackbird/TestAccessFallback.java @@ -1,5 +1,7 @@ package com.fasterxml.jackson.module.blackbird; +import java.lang.reflect.Proxy; + import com.fasterxml.jackson.databind.ObjectMapper; public class TestAccessFallback extends BlackbirdTestBase @@ -69,4 +71,19 @@ public void testDeserializeAccess() throws Exception MyBean bean2 = abMapper.readValue(BEAN_JSON, MyBean.class); assertEquals("a", bean2.getE()); } + + public void testProxyAccessIssue181() throws Exception { + ObjectMapper om = newObjectMapper(); + String val = om.writeValueAsString(Proxy.newProxyInstance(TestAccessFallback.class.getClassLoader(), new Class[] { Beany.class }, (p, m, a) -> { + if (m.getName().equals("getA")) { + return 42; + } + return null; + })); + assertEquals("{\"a\":42}", val); + } + + public interface Beany { + int getA(); + } }