001 /** 002 * www.jcoverage.com 003 * Copyright (C)2003 jcoverage ltd. 004 * 005 * This file is part of jcoverage. 006 * 007 * jcoverage is free software; you can redistribute it and/or modify 008 * it under the terms of the GNU General Public License as published 009 * by the Free Software Foundation; either version 2 of the License, 010 * or (at your option) any later version. 011 * 012 * jcoverage is distributed in the hope that it will be useful, but 013 * WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * General Public License for more details. 016 * 017 * You should have received a copy of the GNU General Public License 018 * along with jcoverage; if not, write to the Free Software 019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 020 * USA 021 * 022 */ 023 package com.jcoverage.util; 024 025 import java.lang.reflect.Method; 026 027 import org.apache.bcel.Constants; 028 029 import org.apache.bcel.classfile.ConstantClass; 030 import org.apache.bcel.classfile.ConstantUtf8; 031 032 import org.apache.bcel.generic.ANEWARRAY; 033 import org.apache.bcel.generic.ArrayType; 034 import org.apache.bcel.generic.BasicType; 035 import org.apache.bcel.generic.BranchHandle; 036 import org.apache.bcel.generic.InstructionConstants; 037 import org.apache.bcel.generic.GOTO; 038 import org.apache.bcel.generic.ClassGen; 039 import org.apache.bcel.generic.ConstantPoolGen; 040 import org.apache.bcel.generic.FieldGen; 041 import org.apache.bcel.generic.IFNONNULL; 042 import org.apache.bcel.generic.InstructionFactory; 043 import org.apache.bcel.generic.InstructionList; 044 import org.apache.bcel.generic.InstructionHandle; 045 import org.apache.bcel.generic.InvokeInstruction; 046 import org.apache.bcel.generic.LDC; 047 import org.apache.bcel.generic.LocalVariableGen; 048 import org.apache.bcel.generic.LocalVariableInstruction; 049 import org.apache.bcel.generic.MethodGen; 050 import org.apache.bcel.generic.ObjectType; 051 import org.apache.bcel.generic.NEW; 052 053 import org.apache.bcel.generic.Type; 054 055 056 public class ClassGenHelper { 057 final ClassGen cg; 058 final InstructionFactory factory; 059 060 private ClassGenHelper(ClassGen cg) { 061 this.cg=cg; 062 this.factory=new InstructionFactory(cg); 063 } 064 065 public static ClassGenHelper newInstance(ClassGen cg) { 066 return new ClassGenHelper(cg); 067 } 068 069 public ClassGen getClassGen() { 070 return cg; 071 } 072 public ConstantPoolGen getConstantPool() { 073 return cg.getConstantPool(); 074 } 075 076 private InstructionList createInvoke(Class cl,String methodName,Class returnType,Type[] parameterTypes,short kind) { 077 InstructionList il=new InstructionList(); 078 il.append(factory.createInvoke(cl.getName(),methodName,TypeHelper.getType(returnType),parameterTypes,kind)); 079 return il; 080 } 081 082 public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType) { 083 return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKEVIRTUAL); 084 } 085 086 public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType,Class signature) { 087 return createInvokeVirtual(cl,methodName,returnType,new Class[]{signature}); 088 } 089 public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType,Class[] signature) { 090 return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKEVIRTUAL); 091 } 092 093 public InstructionList createInvokeStatic(Class cl,String methodName,Class returnType) { 094 return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKESTATIC); 095 } 096 097 public InstructionList createInvokeStatic(Class cl,String methodName,Class returnType,Class[] signature) { 098 return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKESTATIC); 099 } 100 101 public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType) { 102 return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKEINTERFACE); 103 } 104 105 public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType,Class signature) { 106 return createInvokeInterface(cl,methodName,returnType,new Class[]{signature}); 107 } 108 109 public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType,Class[] signature) { 110 return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKEINTERFACE); 111 } 112 113 public InstructionList createInvokeSpecial(Class cl,String methodName,Class returnType) { 114 return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKESPECIAL); 115 } 116 117 public InstructionList createInvokeSpecial(Class cl,String methodName,Class returnType,Class[] signature) { 118 return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKESPECIAL); 119 } 120 121 public InstructionList createInvokeSpecial(Method m) { 122 return createInvokeSpecial(m.getDeclaringClass(),m.getName(),m.getReturnType(),m.getParameterTypes()); 123 } 124 125 public String getClassName(InstructionHandle handleToInvokeInstruction) { 126 return getClassName((InvokeInstruction)handleToInvokeInstruction.getInstruction()); 127 } 128 129 public String getClassName(InvokeInstruction invoke) { 130 return invoke.getClassName(getConstantPool()); 131 } 132 }