1 /*
2  * Copyright 2014 The Netty Project
3  *
4  * The Netty Project licenses this file to you under the Apache License,
5  * version 2.0 (the "License"); you may not use this file except in compliance
6  * with the License. You may obtain a copy of the License at:
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations
14  * under the License.
15  */

16
17 package io.netty.channel;
18
19 import io.netty.util.internal.ObjectUtil;
20 import io.netty.util.internal.StringUtil;
21
22 import java.lang.reflect.Constructor;
23
24 /**
25  * A {@link ChannelFactory} that instantiates a new {@link Channel} by invoking its default constructor reflectively.
26  */

27 public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {
28
29     private final Constructor<? extends T> constructor;
30
31     public ReflectiveChannelFactory(Class<? extends T> clazz) {
32         ObjectUtil.checkNotNull(clazz, "clazz");
33         try {
34             this.constructor = clazz.getConstructor();
35         } catch (NoSuchMethodException e) {
36             throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(clazz) +
37                     " does not have a public non-arg constructor", e);
38         }
39     }
40
41     @Override
42     public T newChannel() {
43         try {
44             return constructor.newInstance();
45         } catch (Throwable t) {
46             throw new ChannelException("Unable to create Channel from class " + constructor.getDeclaringClass(), t);
47         }
48     }
49
50     @Override
51     public String toString() {
52         return StringUtil.simpleClassName(ReflectiveChannelFactory.class) +
53                 '(' + StringUtil.simpleClassName(constructor.getDeclaringClass()) + ".class)";
54     }
55 }
56