1 26 package com.yworks.yguard.obf.classfile; 27 28 import java.io.*; 29 import java.util.*; 30 31 37 abstract public class CpInfo implements ClassConstants 38 { 39 41 42 private int u1tag; 44 private byte info[]; 45 46 protected int refCount = 0; 48 49 55 public static CpInfo create(DataInput din) throws java.io.IOException 56 { 57 if (din == null) throw new NullPointerException ("No input stream was provided."); 58 59 CpInfo ci = null; 61 switch (din.readUnsignedByte()) 62 { 63 case CONSTANT_Utf8: ci = new Utf8CpInfo(); break; 64 case CONSTANT_Integer: ci = new IntegerCpInfo(); break; 65 case CONSTANT_Float: ci = new FloatCpInfo(); break; 66 case CONSTANT_Long: ci = new LongCpInfo(); break; 67 case CONSTANT_Double: ci = new DoubleCpInfo(); break; 68 case CONSTANT_Class: ci = new ClassCpInfo(); break; 69 case CONSTANT_String: ci = new StringCpInfo(); break; 70 case CONSTANT_Fieldref: ci = new FieldrefCpInfo(); break; 71 case CONSTANT_Methodref: ci = new MethodrefCpInfo(); break; 72 case CONSTANT_InterfaceMethodref: ci = new InterfaceMethodrefCpInfo();break; 73 case CONSTANT_NameAndType: ci = new NameAndTypeCpInfo(); break; 74 default: throw new IOException("Unknown tag type in constant pool."); 75 } 76 ci.readInfo(din); 77 return ci; 78 } 79 80 81 protected CpInfo(int tag) 83 { 84 u1tag = tag; 85 } 86 87 88 abstract protected void readInfo(DataInput din) throws java.io.IOException ; 89 90 91 protected void markUtf8Refs(ConstantPool pool) {} 92 93 94 protected void markNTRefs(ConstantPool pool) {} 95 96 97 public void write(DataOutput dout) throws java.io.IOException 98 { 99 if (dout == null) throw new IOException("No output stream was provided."); 100 dout.writeByte(u1tag); 101 writeInfo(dout); 102 } 103 104 105 abstract protected void writeInfo(DataOutput dout) throws java.io.IOException ; 106 107 108 public int getRefCount() {return refCount;} 109 110 111 public void incRefCount() {refCount++;} 112 113 114 public void decRefCount() 115 { 116 if (refCount == 0) throw new IllegalStateException ("Illegal to reference count is already zero."); 117 refCount--; 118 } 119 120 121 public void resetRefCount() {refCount = 0;} 122 123 124 public void dump(PrintWriter pw, ClassFile cf, int index) { 125 pw.println(this.getClass().getName()); 126 } 127 } 128 | Popular Tags |