package com.cedarsoftware.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* Handy utilities for working with Java arrays.
*
* @author Ken Partlow
* <br>
* Copyright (c) Cedar Software LLC
* <br><br>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <br><br>
* http://www.apache.org/licenses/LICENSE-2.0
* <br><br>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public final class ProxyFactory
{
/**
* This class should be used statically
*/
private ProxyFactory() {}
/**
* Returns an instance of a proxy class for the specified interfaces
* that dispatches method invocations to the specified invocation
* handler.
*
* @param intf the interface for the proxy to implement
* @param h the invocation handler to dispatch method invocations to
* @return a proxy instance with the specified invocation handler of a
* proxy class that is defined by the specified class loader
* and that implements the specified interfaces
* @throws IllegalArgumentException if any of the restrictions on the
* parameters that may be passed to <code>getProxyClass</code>
* are violated
* @throws NullPointerException if the <code>interfaces</code> array
* argument or any of its elements are <code>null</code>, or
* if the invocation handler, <code>h</code>, is
* <code>null</code>
*/
public static <T> T create(Class<T> intf, InvocationHandler h) {
return create(h.getClass().getClassLoader(), intf, h);
}
/**
* Returns an instance of a proxy class for the specified interfaces
* that dispatches method invocations to the specified invocation
* handler.
*
* @param loader the class loader to define the proxy class
* @param intf the interface for the proxy to implement
* @param h the invocation handler to dispatch method invocations to
* @return a proxy instance with the specified invocation handler of a
* proxy class that is defined by the specified class loader
* and that implements the specified interfaces
* @throws IllegalArgumentException if any of the restrictions on the
* parameters that may be passed to <code>getProxyClass</code>
* are violated
* @throws NullPointerException if the <code>interfaces</code> array
* argument or any of its elements are <code>null</code>, or
* if the invocation handler, <code>h</code>, is
* <code>null</code>
*/
public static <T> T create(ClassLoader loader, Class<T> intf, InvocationHandler h) {
return (T)Proxy.newProxyInstance(loader, new Class[]{intf}, h);
}
}