APIdia Launch Partner
Top Description Inners Fields Constructors Methods
jdk.jpackage.internal.util

public final Class CompositeProxy

extends Object
Class Inheritance
Static Imports
java.util.stream.Collectors.toMap, .Collectors.toSet

Dynamic proxy dispatching method calls to multiple objects. It is aimed at creating objects from mixins. The class provides functionality similar to that of net.sf.cglib.proxy.Mixin class from the cglib library. Sample usage:
interface Sailboat { default void trimSails() { } } interface WithMain { void trimMain(); } interface WithJib { void trimJib(); } interface Sloop extends Sailboat, WithMain, WithJib { @Override public default void trimSails() { System.out.println("On the sloop:"); trimMain(); trimJib(); } } interface Catboat extends Sailboat, WithMain { @Override public default void trimSails() { System.out.println("On the catboat:"); trimMain(); } } final var withMain = new WithMain() { @Override public void trimMain() { System.out.println(" trim the main"); } }; final var withJib = new WithJib() { @Override public void trimJib() { System.out.println(" trim the jib"); } }; Sloop sloop = CompositeProxy.create(Sloop.class, withMain, withJib); Catboat catboat = CompositeProxy.create(Catboat.class, withMain); sloop.trimSails(); catboat.trimSails();
interface Sailboat {
    default void trimSails() {
    }
}

interface WithMain {
    void trimMain();
}

interface WithJib {
    void trimJib();
}

interface Sloop extends Sailboat, WithMain, WithJib {
    @Override
    public default void trimSails() {
        System.out.println("On the sloop:");
        trimMain();
        trimJib();
    }
}

interface Catboat extends Sailboat, WithMain {
    @Override
    public default void trimSails() {
        System.out.println("On the catboat:");
        trimMain();
    }
}

final var withMain = new WithMain() {
    @Override
    public void trimMain() {
        System.out.println("  trim the main");
    }
};

final var withJib = new WithJib() {
    @Override
    public void trimJib() {
        System.out.println("  trim the jib");
    }
};

Sloop sloop = CompositeProxy.create(Sloop.class, withMain, withJib);

Catboat catboat = CompositeProxy.create(Catboat.class, withMain);

sloop.trimSails();
catboat.trimSails();
Output:
On the sloop:
  trim the main
  trim the jib
On the cat:
  trim the main
See Also
Proxy

Nested and Inner Type Summary

Modifier and TypeClass and Description
public static class
private static record
private static record
private static interface
public static interface
CompositeProxy.InvokeTunnel

Invocation tunnel.

public static interface
CompositeProxy.MethodConflictResolver

Method conflict resolver.

private static record
public static interface
CompositeProxy.ObjectConflictResolver

Object conflict resolver.

Field Summary

Modifier and TypeField and Description
private static final CompositeProxy.MethodConflictResolver
private static final CompositeProxy.ObjectConflictResolver

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public static CompositeProxy.Builder

Returns:

a new proxy builder
build
()

Creates a new proxy builder.

public static <T> T
create(Class<T> interfaceType, Object... slices)

Shortcut for CompositeProxy.build().create(interfaceType, slices).

private static <T> T
createCompositeProxy(Class<T> interfaceType, CompositeProxy.MethodConflictResolver methodConflictResolver, CompositeProxy.ObjectConflictResolver objectConflictResolver, CompositeProxy.InvokeTunnel invokeTunnel, boolean allowUnreferencedSlices, Object... slices)

private static CompositeProxy.Handler
private static CompositeProxy.Handler
pack-priv static Optional<Map<IdentityWrapper<Object>, Class<?>>>
detectJPackageConfiguration(Class<?>
the interface type composite proxy instance should implement
interfaceType
,
Object...
all objects passed to the calling composite proxy. The value is a copy of the last parameter passed in the Builder#create(Class, Object...)
slices
)

Returns the standard jpackage configuration if the values of interfaceType and slices parameters comprise such or an empty Optional otherwise.

private static Stream<Method>
private static Stream<Method>
getProxyableMethods(Class<?> interfaceType)

private static List<Class<?>>
private static Stream<Method>
private static Stream<Method>
private static Stream<Method>
private static boolean
private static Stream<Class<?>>
unfoldInterface(Class<?> interfaceType)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait