1 27 28 package com.adventnet.jmx; 29 30 import java.io.File ; 31 import java.io.FileInputStream ; 32 import java.util.Hashtable ; 33 34 import com.adventnet.agent.logging.Log; 35 import com.adventnet.agent.logging.LogFactory; 36 37 43 public class DefaultClassLoader extends ClassLoader 44 { 45 private Hashtable classes = new Hashtable (); 47 private char classNameReplacementChar; 48 49 protected boolean monitorOn = false; 50 protected boolean sourceMonitorOn = true; 51 52 private String filePrefix = File.separator; 53 private Log log = null; 54 55 public DefaultClassLoader() 57 { 58 try 59 { 60 log = LogFactory.getInstance("JMX"); 61 } 62 catch(Exception e) 63 { 64 e.printStackTrace(); 65 } 66 } 67 68 70 72 77 public Class loadClass(String className) throws ClassNotFoundException 78 { 79 return (loadClass(className, true)); 80 } 81 82 public synchronized Class loadClass(String className, boolean resolveIt) 84 throws ClassNotFoundException 85 { 86 Class result; 87 byte[] classBytes; 88 89 result = (Class )classes.get(className); 91 if (result != null) 92 { 93 return result; 94 } 95 96 try 98 { 99 result = super.findSystemClass(className); 100 101 return result; 102 } 103 catch (ClassNotFoundException e) 104 { 105 log.debug(">> Not a system class."); 106 } 107 108 classBytes = loadClassBytes(className); 111 112 if (classBytes == null) 113 { 114 throw new ClassNotFoundException (); 115 } 116 117 result = defineClass(null, classBytes, 0, classBytes.length); 119 if (result == null) 120 { 121 throw new ClassFormatError (); 122 } 123 124 if (resolveIt) resolveClass(result); 126 127 classes.put(className, result); 129 log.debug(">> Returning newly loaded class."); 130 131 return result; 132 } 133 134 140 public void setClassNameReplacementChar(char replacement) 141 { 142 classNameReplacementChar = replacement; 143 } 144 145 private byte[] loadClassBytes(String className) 146 { 147 className = formatClassName(className); 148 149 byte result[]; 150 String fileName = filePrefix + className; 151 153 try 154 { 155 FileInputStream inStream = new FileInputStream (fileName); 156 157 result = new byte[inStream.available()]; 158 inStream.read(result); 159 inStream.close(); 160 161 return result; 162 } 163 catch (Exception e) 164 { 165 log.debug("loadClassBytes",e); 168 return null; 169 } 170 } 171 172 protected String formatClassName(String className) 173 { 174 if (classNameReplacementChar == '\u0000') 175 { 176 return className.replace('.', '/') + ".class"; 178 } 179 else 180 { 181 return className.replace('.', 183 classNameReplacementChar) + ".class"; 184 } 185 } 186 } | Popular Tags |