• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Javassist, a Java-bytecode translator toolkit.
3  * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License.  Alternatively, the contents of this file may be used under
8  * the terms of the GNU Lesser General Public License Version 2.1 or later.
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  */
15 
16 package javassist;
17 
18 /**
19  * Array types.
20  */
21 final class CtArray extends CtClass {
22     protected ClassPool pool;
23 
24     // the name of array type ends with "[]".
CtArray(String name, ClassPool cp)25     CtArray(String name, ClassPool cp) {
26         super(name);
27         pool = cp;
28     }
29 
getClassPool()30     public ClassPool getClassPool() {
31         return pool;
32     }
33 
isArray()34     public boolean isArray() {
35         return true;
36     }
37 
38     private CtClass[] interfaces = null;
39 
getModifiers()40     public int getModifiers() {
41         int mod = Modifier.FINAL;
42         try {
43             mod |= getComponentType().getModifiers()
44                    & (Modifier.PROTECTED | Modifier.PUBLIC | Modifier.PRIVATE);
45         }
46         catch (NotFoundException e) {}
47         return mod;
48     }
49 
getInterfaces()50     public CtClass[] getInterfaces() throws NotFoundException {
51         if (interfaces == null) {
52             Class[] intfs = Object[].class.getInterfaces();
53             // java.lang.Cloneable and java.io.Serializable.
54             // If the JVM is CLDC, intfs is empty.
55             interfaces = new CtClass[intfs.length];
56             for (int i = 0; i < intfs.length; i++)
57                 interfaces[i] = pool.get(intfs[i].getName());
58         }
59 
60         return interfaces;
61     }
62 
subtypeOf(CtClass clazz)63     public boolean subtypeOf(CtClass clazz) throws NotFoundException {
64         if (super.subtypeOf(clazz))
65             return true;
66 
67         String cname = clazz.getName();
68         if (cname.equals(javaLangObject))
69             return true;
70 
71         CtClass[] intfs = getInterfaces();
72         for (int i = 0; i < intfs.length; i++)
73             if (intfs[i].subtypeOf(clazz))
74                 return true;
75 
76         return clazz.isArray()
77             && getComponentType().subtypeOf(clazz.getComponentType());
78     }
79 
getComponentType()80     public CtClass getComponentType() throws NotFoundException {
81         String name = getName();
82         return pool.get(name.substring(0, name.length() - 2));
83     }
84 
getSuperclass()85     public CtClass getSuperclass() throws NotFoundException {
86         return pool.get(javaLangObject);
87     }
88 
getMethods()89     public CtMethod[] getMethods() {
90         try {
91             return getSuperclass().getMethods();
92         }
93         catch (NotFoundException e) {
94             return super.getMethods();
95         }
96     }
97 
getMethod(String name, String desc)98     public CtMethod getMethod(String name, String desc)
99         throws NotFoundException
100     {
101         return getSuperclass().getMethod(name, desc);
102     }
103 
getConstructors()104     public CtConstructor[] getConstructors() {
105         try {
106             return getSuperclass().getConstructors();
107         }
108         catch (NotFoundException e) {
109             return super.getConstructors();
110         }
111     }
112 }
113