1 /*
2 * Copyright 2010 Stephen Colebourne
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * 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,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.joda.convert;
17
18 import java.lang.reflect.InvocationTargetException;
19 import java.lang.reflect.Method;
20
21 /**
22 * Conversion to and from a string using reflection.
23 * <p>
24 * The toString method must meet the following signature:<br />
25 * {@code String anyName()} on Class T.
26 * <p>
27 * ReflectionStringConverter is abstract, but all known implementations are thread-safe and immutable.
28 *
29 * @param <T> the type of the converter
30 */
31 abstract class ReflectionStringConverter<T> implements StringConverter<T> {
32
33 /** The converted class. */
34 final Class<T> cls;
35 /** Conversion to a string. */
36 final Method toString;
37
38 /**
39 * Creates an instance using two methods.
40 * @param cls the class this converts for, not null
41 * @param toString the toString method, not null
42 * @throws RuntimeException (or subclass) if the method signatures are invalid
43 */
44 ReflectionStringConverter(Class<T> cls, Method toString) {
45 if (toString.getParameterTypes().length != 0) {
46 throw new IllegalStateException("ToString method must have no parameters");
47 }
48 if (toString.getReturnType() != String.class) {
49 throw new IllegalStateException("ToString method must return a String");
50 }
51 this.cls = cls;
52 this.toString = toString;
53 }
54
55 //-----------------------------------------------------------------------
56 /**
57 * Converts the object to a {@code String}.
58 * @param object the object to convert, not null
59 * @return the converted string, may be null but generally not
60 */
61 public String convertToString(T object) {
62 try {
63 return (String) toString.invoke(object);
64 } catch (IllegalAccessException ex) {
65 throw new IllegalStateException("Method is not accessible");
66 } catch (InvocationTargetException ex) {
67 if (ex.getCause() instanceof RuntimeException) {
68 throw (RuntimeException) ex.getCause();
69 }
70 throw new RuntimeException(ex.getMessage(), ex.getCause());
71 }
72 }
73
74 //-----------------------------------------------------------------------
75 @Override
76 public String toString() {
77 return "RefectionStringConverter[" + cls.getSimpleName() + "]";
78 }
79
80 }