Code Monkey home page Code Monkey logo

invokedynamic-proxy's Introduction

invokedynamic-proxy

An alternate to the built-in Java Proxy; uses Java 7 features and invokedynamic to provide better performance and access to features unavailable through standard Proxies.

Get it from Maven

Usage

public class Demo {
    public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();

    public interface HelloWorld {
        public void sayHi();
    }

    private static void impl_sayHi(Object proxyObject) {
        System.out.println("Hello world!");
    }

    public static void main(String[] args) throws Throwable {
        DynamicInvocationHandler handler = (lookup, name, type, superMethod) -> {
            if (name.equals("sayHi")) {
                return new ConstantCallSite(
                    LOOKUP.findStatic(
                             Demo.class,
                             "impl_sayHi",
                             MethodType.methodType(Void.TYPE, Object.class)
                           ).asType(type)
                );
            } else {
                return new ConstantCallSite(superMethod);
            }
        };

        DynamicProxy proxy = DynamicProxy.builder()
                .withInterfaces(HelloWorld.class)
                .withInvocationHandler(handler)
                .build();

        HelloWorld helloWorld = (HelloWorld)proxy.constructor().invoke();
        helloWorld.sayHi();
    }
}

That looks more complicated than using Proxy

It is, a little. You do however get two big benefits from this method:

  • Better performance. You avoid reflective overhead and boxing by using invokedynamic instead of going through proxy invocation handlers. You also avoid running your dispatch logic each time you invoke the method; it runs once, and the JVM then binds directly to the call site.
  • Access to superclass and default methods. Currently there is no documented/supported way to access interface default method implementations from a Proxy method handler. With invokedynamic-proxy, the superclass or default method is passed in to your handler (and you also get a Lookup instance with access to private and super-methods of the proxy class).

What version of Java does this need?

Java 8. Not for any particularly compelling reason, but if you're on Java 7 you really ought to move on to 8 anyway, just for the security support.

License

Copyright © 2015 Bryan Donlan

Distributed under the CC0 license.

invokedynamic-proxy's People

Contributors

bdonlan avatar rschmitt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

invokedynamic-proxy's Issues

Add support for custom proxy class names

Consider the following REPL fragment:

(def ll
  (DynamicObject/deserialize
    "#LL{:next #LL{:next #LL{:next nil, :value 3}, :value 2}, :value 1}"
    RecursionTest$LinkedList))
=> #'user/ll
(class ll)
=> net.fushizen.invokedynamic.proxy.generated.Proxy$1
(.getType ll)
=> com.github.rschmitt.dynamicobject.RecursionTest$LinkedList

This is fine as far as it goes, but I'm wondering if there's any reason why names can't be customized as part of the Builder process. I was able to hack up a prototype in about two minutes, and now I get this:

(def ll (DynamicObject/deserialize "#LL{:next #LL{:next #LL{:next nil, :value 3}, :value 2}, :value 1}" RecursionTest$LinkedList))
=> #'user/ll
(class ll)
=> com.github.rschmitt.dynamicobject.LinkedListProxy$1

Not bad, right? All my tests still seem to pass, but maybe this will break some weird thing I'm not thinking about.

Support JDK9

indy-proxy doesn't seem to build on JDK9. The unit tests throw InaccessibleObjectExceptions and (more worryingly) ICCEs:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.fushizen.invokedynamic.proxy.ArbitraryConstructorTests
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 sec - in net.fushizen.invokedynamic.proxy.ArbitraryConstructorTests
Running net.fushizen.invokedynamic.proxy.DynamicProxyArgAndReturnTests
Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.061 sec <<< FAILURE! - in net.fushizen.invokedynamic.proxy.DynamicProxyArgAndReturnTests
testArgs(net.fushizen.invokedynamic.proxy.DynamicProxyArgAndReturnTests)  Time elapsed: 0.05 sec  <<< ERROR!
java.lang.ExceptionInInitializerError: null
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at org.mockito.cglib.core.ReflectUtils$2.run(ReflectUtils.java:57)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at org.mockito.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:47)
	at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
	at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
	at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
	at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
	at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
	at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
	at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
	at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)
	at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
	at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
	at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
	at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
	at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
	at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
	at org.mockito.Mockito.mock(Mockito.java:1285)
	at org.mockito.Mockito.mock(Mockito.java:1163)
	at net.fushizen.invokedynamic.proxy.DynamicProxyArgAndReturnTests.testArgs(DynamicProxyArgAndReturnTests.java:76)

Running net.fushizen.invokedynamic.proxy.DynamicProxySmokeTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 sec - in net.fushizen.invokedynamic.proxy.DynamicProxySmokeTest
Running net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests
Tests run: 16, Failures: 0, Errors: 8, Skipped: 0, Time elapsed: 0.039 sec <<< FAILURE! - in net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests
whenDefaultMethodIsAccessibleThroughSuperclass_noErrorThrown(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.004 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultMethodIsAccessibleThroughSuperclass_noErrorThrown(DynamicProxySuperclassTests.java:175)

whenDefaultMethodIsAccessibleThroughSuperinterface_noErrorThrown(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.003 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultMethodIsAccessibleThroughSuperinterface_noErrorThrown(DynamicProxySuperclassTests.java:186)

whenDefaultImplementationAvailable_itCanBeOverridden(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.003 sec  <<< ERROR!
java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class net/fushizen/invokedynamic/proxy/DynamicProxySuperclassTests$I1. Method foo()Ljava/lang/String; at index 61 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
	at net.fushizen.invokedynamic.proxy.generated.DynamicProxy$$9.foo(Unknown Source)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultImplementationAvailable_itCanBeOverridden(DynamicProxySuperclassTests.java:52)

whenDefaultImplementationAvailable_itIsDelegatedTo(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class net/fushizen/invokedynamic/proxy/DynamicProxySuperclassTests$I1. Method foo()Ljava/lang/String; at index 61 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
	at net.fushizen.invokedynamic.proxy.generated.DynamicProxy$$10.foo(Unknown Source)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultImplementationAvailable_itIsDelegatedTo(DynamicProxySuperclassTests.java:25)

whenDefaultMethodProviderIsInaccessible_andPackageSetImplicitly_noExceptionThrown(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultMethodProviderIsInaccessible_andPackageSetImplicitly_noExceptionThrown(DynamicProxySuperclassTests.java:214)

whenDefaultMethodProviderIsInaccessible_andPackageSet_noExceptionThrown(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenDefaultMethodProviderIsInaccessible_andPackageSet_noExceptionThrown(DynamicProxySuperclassTests.java:206)

whenShadowedSupermethodIsCalled_superMethodHandleIsAvailable(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class net/fushizen/invokedynamic/proxy/DynamicProxySuperclassTests$SuperSuper. Method method()I at index 70 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
	at net.fushizen.invokedynamic.proxy.generated.DynamicProxy$$18.method(Unknown Source)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenShadowedSupermethodIsCalled_superMethodHandleIsAvailable(DynamicProxySuperclassTests.java:74)

whenAbstractVariantsAvailable_callIsNotAmbiguous(net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class net/fushizen/invokedynamic/proxy/DynamicProxySuperclassTests$I1. Method foo()Ljava/lang/String; at index 63 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
	at net.fushizen.invokedynamic.proxy.generated.DynamicProxy$$21.foo(Unknown Source)
	at net.fushizen.invokedynamic.proxy.DynamicProxySuperclassTests.whenAbstractVariantsAvailable_callIsNotAmbiguous(DynamicProxySuperclassTests.java:89)

Running net.fushizen.invokedynamic.proxy.DynamicProxyVisibilityTests
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec - in net.fushizen.invokedynamic.proxy.DynamicProxyVisibilityTests
Running net.fushizen.invokedynamic.proxy.ErrorCaseTests
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec - in net.fushizen.invokedynamic.proxy.ErrorCaseTests
Running net.fushizen.invokedynamic.proxy.PrivateAccessTests
Tests run: 8, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.008 sec <<< FAILURE! - in net.fushizen.invokedynamic.proxy.PrivateAccessTests
testProtectedInterface(net.fushizen.invokedynamic.proxy.PrivateAccessTests)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.PrivateAccessTests.testProtectedInterface(PrivateAccessTests.java:16)

testPackagePrivateSupers(net.fushizen.invokedynamic.proxy.PrivateAccessTests)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.PrivateAccessTests.testPackagePrivateSupers(PrivateAccessTests.java:38)

testProtectedSuperclassOtherPackage(net.fushizen.invokedynamic.proxy.PrivateAccessTests)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.PrivateAccessTests.testProtectedSuperclassOtherPackage(PrivateAccessTests.java:28)

testProtectedSuperclass(net.fushizen.invokedynamic.proxy.PrivateAccessTests)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @72f926e6
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.loadClass(DynamicProxy.java:398)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.generateProxyClass(DynamicProxy.java:380)
	at net.fushizen.invokedynamic.proxy.DynamicProxy.access$000(DynamicProxy.java:20)
	at net.fushizen.invokedynamic.proxy.DynamicProxy$Builder.build(DynamicProxy.java:320)
	at net.fushizen.invokedynamic.proxy.PrivateAccessTests.testProtectedSuperclass(PrivateAccessTests.java:23)

Running net.fushizen.invokedynamic.proxy.ProxyProxyTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec - in net.fushizen.invokedynamic.proxy.ProxyProxyTest
Running net.fushizen.invokedynamic.proxy.StatefulProxyTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec - in net.fushizen.invokedynamic.proxy.StatefulProxyTest

Results :

Tests in error: 
  DynamicProxyArgAndReturnTests.testArgs:76 » ExceptionInInitializer
  DynamicProxySuperclassTests.whenAbstractVariantsAvailable_callIsNotAmbiguous:89 » IncompatibleClassChange
  DynamicProxySuperclassTests.whenDefaultImplementationAvailable_itCanBeOverridden:52 » IncompatibleClassChange
  DynamicProxySuperclassTests.whenDefaultImplementationAvailable_itIsDelegatedTo:25 » IncompatibleClassChange
  DynamicProxySuperclassTests.whenDefaultMethodIsAccessibleThroughSuperclass_noErrorThrown:175 » InaccessibleObject
  DynamicProxySuperclassTests.whenDefaultMethodIsAccessibleThroughSuperinterface_noErrorThrown:186 » InaccessibleObject
  DynamicProxySuperclassTests.whenDefaultMethodProviderIsInaccessible_andPackageSetImplicitly_noExceptionThrown:214 » InaccessibleObject
  DynamicProxySuperclassTests.whenDefaultMethodProviderIsInaccessible_andPackageSet_noExceptionThrown:206 » InaccessibleObject
  DynamicProxySuperclassTests.whenShadowedSupermethodIsCalled_superMethodHandleIsAvailable:74 » IncompatibleClassChange
  PrivateAccessTests.testPackagePrivateSupers:38 » InaccessibleObject Unable to ...
  PrivateAccessTests.testProtectedInterface:16 » InaccessibleObject Unable to ma...
  PrivateAccessTests.testProtectedSuperclass:23 » InaccessibleObject Unable to m...
  PrivateAccessTests.testProtectedSuperclassOtherPackage:28 » InaccessibleObject

Tests run: 41, Failures: 0, Errors: 13, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] net.fushizen.invokedynamic.proxy:invokedynamic-proxy FAILURE [  1.999 s]
[INFO] invokedynamic-proxy-pom ............................ SKIPPED
[INFO] JMH benchmark sample: Java ......................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.076 s
[INFO] Finished at: 2016-12-28T23:14:28-08:00
[INFO] Final Memory: 11M/38M
[INFO] ------------------------------------------------------------------------

Maven-imported invokedynamic-proxy is unusable

I've added the following to my pom.xml:

     <dependency>
      <groupId>net.fushizen.invokedynamic.proxy</groupId>
      <artifactId>invokedynamic-proxy</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
    </dependency>

When I run mvn clean install -U, I get the following error:

[ERROR] Failed to execute goal on project dynamic-object: Could not resolve dependencies for project com.github.rschmitt:dynamic-object:jar:1.3.1: Failed to collect dependencies at net.fushizen.invokedynamic.proxy:invokedynamic-proxy:jar:1.0: Failed to read artifact descriptor for net.fushizen.invokedynamic.proxy:invokedynamic-proxy:jar:1.0: Could not find artifact net.fushizen.invokedynamic.proxy:invokedynamic-proxy-pom:pom:1.0 in central (http://repo.maven.apache.org/maven2) -> [Help 1]

Additionally, your pom.xml includes a CC0 license block, but invokedynamic-proxy is distributed under the 2-clause BSD license.

Proxies on package private classes don't appear to work

I haven't tested protected classes yet (I guess you don't technically claim to support package private classes), but package private classes give me errors:

Tests in error:
instantPresent(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$23 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
listPresent(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$24 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
valuePresent(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$25 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
nonOptionalBuilder(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$26 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
optionalValidationFailure(com.github.rschmitt.dynamicobject.OptionalTest): Unexpected exception, expected<java.lang.IllegalStateException> but was<java.lang.RuntimeException>
optionalValidation(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$28 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
dynamicObjectPresent(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$29 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
intPresent(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$30 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper
valueMissing(com.github.rschmitt.dynamicobject.OptionalTest): java.lang.IllegalAccessError: class com.github.rschmitt.dynamicobject.Proxy$31 cannot access its superinterface com.github.rschmitt.dynamicobject.OptWrapper

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.