1/* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package sun.reflect.generics.reflectiveObjects; 27 28import java.lang.reflect.Type; 29import sun.reflect.generics.factory.GenericsFactory; 30import sun.reflect.generics.tree.FieldTypeSignature; 31import sun.reflect.generics.visitor.Reifier; 32 33 34/** 35 * Common infrastructure for things that lazily generate reflective generics 36 * objects. 37 * <p> In all these cases, one needs produce a visitor that will, on demand, 38 * traverse the stored AST(s) and reify them into reflective objects. 39 * The visitor needs to be initialized with a factory, which will be 40 * provided when the instance is initialized. 41 * The factory should be cached. 42 * 43*/ 44public abstract class LazyReflectiveObjectGenerator { 45 private final GenericsFactory factory; // cached factory 46 47 protected LazyReflectiveObjectGenerator(GenericsFactory f) { 48 factory = f; 49 } 50 51 // accessor for factory 52 private GenericsFactory getFactory() { 53 return factory; 54 } 55 56 // produce a reifying visitor (could this be typed as a TypeTreeVisitor? 57 protected Reifier getReifier(){return Reifier.make(getFactory());} 58 59 Type[] reifyBounds(FieldTypeSignature[] boundASTs) { 60 final int length = boundASTs.length; 61 final Type[] bounds = new Type[length]; 62 // iterate over bound trees, reifying each in turn 63 for (int i = 0; i < length; i++) { 64 Reifier r = getReifier(); 65 boundASTs[i].accept(r); 66 bounds[i] = r.getResult(); 67 } 68 return bounds; 69 } 70 71} 72