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
19 import java.lang.reflect.Proxy;
20 import java.util.Arrays;
21
22 import org.apache.commons.pool2.UsageTracking;
23
24 /**
25 * Provides proxy objects using Java reflection.
26 *
27 * @param <T> type of the pooled object to be proxied
28 * @since 2.0
29 */
30 public class JdkProxySource<T> implements ProxySource<T> {
31
32 private final ClassLoader classLoader;
33 private final Class<?>[] interfaces;
34
35 /**
36 * Constructs a new proxy source for the given interfaces.
37 *
38 * @param classLoader The class loader with which to create the proxy
39 * @param interfaces The interfaces to proxy
40 */
41 public JdkProxySource(final ClassLoader classLoader, final Class<?>[] interfaces) {
42 this.classLoader = classLoader;
43 // Defensive copy
44 this.interfaces = Arrays.copyOf(interfaces, interfaces.length);
45 }
46
47 @SuppressWarnings("unchecked") // Cast to T on return.
48 @Override
49 public T createProxy(final T pooledObject, final UsageTracking<T> usageTracking) {
50 return (T) Proxy.newProxyInstance(classLoader, interfaces,
51 new JdkProxyHandler<>(pooledObject, usageTracking));
52 }
53
54 @SuppressWarnings("unchecked")
55 @Override
56 public T resolveProxy(final T proxy) {
57 return ((JdkProxyHandler<T>) Proxy.getInvocationHandler(proxy)).disableProxy();
58 }
59
60 /**
61 * @since 2.4.3
62 */
63 @Override
64 public String toString() {
65 final StringBuilder builder = new StringBuilder();
66 builder.append("JdkProxySource [classLoader=");
67 builder.append(classLoader);
68 builder.append(", interfaces=");
69 builder.append(Arrays.toString(interfaces));
70 builder.append("]");
71 return builder.toString();
72 }
73 }