001: /*
002:
003: Derby - Class org.apache.derby.iapi.services.loader.ClassInfo
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.iapi.services.loader;
023:
024: import java.lang.reflect.Constructor;
025: import java.lang.reflect.InvocationTargetException;
026:
027: public class ClassInfo implements InstanceGetter {
028:
029: private static final Class[] noParameters = new Class[0];
030: private static final Object[] noArguments = new Object[0];
031:
032: private final Class clazz;
033: private boolean useConstructor = true;
034: private Constructor noArgConstructor;
035:
036: public ClassInfo(Class clazz) {
037: this .clazz = clazz;
038: }
039:
040: /**
041: Return the name of this class.
042: */
043: public final String getClassName() {
044: return clazz.getName();
045: }
046:
047: /**
048: Return the class object for this class.
049:
050: */
051: public final Class getClassObject() {
052:
053: return clazz;
054: }
055:
056: /**
057: Create an instance of this class. Assumes that clazz has already been
058: initialized. Optimizes Class.newInstance() by caching and using the
059: no-arg Constructor directly. Class.newInstance() looks up the constructor
060: each time.
061:
062: @exception InstantiationException Zero arg constructor can not be executed
063: @exception IllegalAccessException Class or zero arg constructor is not public.
064: @exception InvocationTargetException Exception throw in zero-arg constructor.
065:
066: */
067: public Object getNewInstance() throws InstantiationException,
068: IllegalAccessException, InvocationTargetException {
069:
070: if (!useConstructor) {
071:
072: return clazz.newInstance();
073: }
074:
075: if (noArgConstructor == null) {
076:
077: try {
078: noArgConstructor = clazz.getConstructor(noParameters);
079:
080: } catch (NoSuchMethodException nsme) {
081: // let Class.newInstace() generate the exception
082: useConstructor = false;
083: return getNewInstance();
084:
085: } catch (SecurityException se) {
086: // not allowed to to get a handle on the constructor
087: // just use the standard mechanism.
088: useConstructor = false;
089: return getNewInstance();
090: }
091: }
092:
093: try {
094: return noArgConstructor.newInstance(noArguments);
095: } catch (IllegalArgumentException iae) {
096: // can't happen since no arguments are passed.
097: return null;
098: }
099: }
100: }
|