Home | History | Annotate | Download | only in javassist
      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 import javassist.bytecode.ClassFile;
     19 import javassist.bytecode.AccessFlag;
     20 import javassist.bytecode.InnerClassesAttribute;
     21 
     22 /**
     23  * A newly created public nested class.
     24  */
     25 class CtNewNestedClass extends CtNewClass {
     26     CtNewNestedClass(String realName, ClassPool cp, boolean isInterface,
     27                      CtClass superclass) {
     28         super(realName, cp, isInterface, superclass);
     29     }
     30 
     31     /**
     32      * This method does not change the STATIC bit.  The original value is kept.
     33      */
     34     public void setModifiers(int mod) {
     35         mod = mod & ~Modifier.STATIC;
     36         super.setModifiers(mod);
     37         updateInnerEntry(mod, getName(), this, true);
     38     }
     39 
     40     private static void updateInnerEntry(int mod, String name, CtClass clazz, boolean outer) {
     41         ClassFile cf = clazz.getClassFile2();
     42         InnerClassesAttribute ica = (InnerClassesAttribute)cf.getAttribute(
     43                                                 InnerClassesAttribute.tag);
     44         if (ica == null)
     45             return;
     46 
     47         int n = ica.tableLength();
     48         for (int i = 0; i < n; i++)
     49             if (name.equals(ica.innerClass(i))) {
     50                 int acc = ica.accessFlags(i) & AccessFlag.STATIC;
     51                 ica.setAccessFlags(i, mod | acc);
     52                 String outName = ica.outerClass(i);
     53                 if (outName != null && outer)
     54                     try {
     55                         CtClass parent = clazz.getClassPool().get(outName);
     56                         updateInnerEntry(mod, name, parent, false);
     57                     }
     58                     catch (NotFoundException e) {
     59                         throw new RuntimeException("cannot find the declaring class: "
     60                                                    + outName);
     61                     }
     62 
     63                 break;
     64             }
     65     }
     66 }
     67