JdkProxySource.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.apache.commons.pool2.proxy;

  18. import java.lang.reflect.Proxy;
  19. import java.util.Arrays;

  20. import org.apache.commons.pool2.UsageTracking;

  21. /**
  22.  * Provides proxy objects using Java reflection.
  23.  *
  24.  * @param <T> type of the pooled object to be proxied
  25.  * @since 2.0
  26.  */
  27. public class JdkProxySource<T> implements ProxySource<T> {

  28.     private final ClassLoader classLoader;
  29.     private final Class<?>[] interfaces;

  30.     /**
  31.      * Constructs a new proxy source for the given interfaces.
  32.      *
  33.      * @param classLoader The class loader with which to create the proxy
  34.      * @param interfaces  The interfaces to proxy
  35.      */
  36.     public JdkProxySource(final ClassLoader classLoader, final Class<?>[] interfaces) {
  37.         this.classLoader = classLoader;
  38.         // Defensive copy
  39.         this.interfaces = Arrays.copyOf(interfaces, interfaces.length);
  40.     }

  41.     @SuppressWarnings("unchecked") // Cast to T on return.
  42.     @Override
  43.     public T createProxy(final T pooledObject, final UsageTracking<T> usageTracking) {
  44.         return (T) Proxy.newProxyInstance(classLoader, interfaces,
  45.                 new JdkProxyHandler<>(pooledObject, usageTracking));
  46.     }

  47.     @SuppressWarnings("unchecked")
  48.     @Override
  49.     public T resolveProxy(final T proxy) {
  50.         return ((JdkProxyHandler<T>) Proxy.getInvocationHandler(proxy)).disableProxy();
  51.     }

  52.     /**
  53.      * @since 2.4.3
  54.      */
  55.     @Override
  56.     public String toString() {
  57.         final StringBuilder builder = new StringBuilder();
  58.         builder.append("JdkProxySource [classLoader=");
  59.         builder.append(classLoader);
  60.         builder.append(", interfaces=");
  61.         builder.append(Arrays.toString(interfaces));
  62.         builder.append("]");
  63.         return builder.toString();
  64.     }
  65. }