Java安全之动态加载字节码( 三 )

先看TemplatesImpl#defineTransletClasses()方法:
private void defineTransletClasses()        throws TransformerConfigurationException {        if (_bytecodes == null) {            ErrorMsg err = new ErrorMsg(ErrorMsg.NO_TRANSLET_CLASS_ERR);            throw new TransformerConfigurationException(err.toString());        }        TransletClassLoader loader = (TransletClassLoader)            AccessController.doPrivileged(new PrivilegedAction() {                public Object run() {                    return new TransletClassLoader(ObjectFactory.findClassLoader(),_tfactory.getExternalExtensionsMap());                }            });        try {            final int classCount = _bytecodes.length;            _class = new Class[classCount];            if (classCount > 1) {                _auxClasses = new HashMap<>();            }            for (int i = 0; i < classCount; i++) {                _class[i] = loader.defineClass(_bytecodes[i]);//在这里调用了defineClass                final Class superClass = _class[i].getSuperclass();                // Check if this is the main class                if (superClass.getName().equals(ABSTRACT_TRANSLET)) {                    _transletIndex = i;                }                else {                    _auxClasses.put(_class[i].getName(), _class[i]);                }            }            if (_transletIndex < 0) {                ErrorMsg err= new ErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR, _name);                throw new TransformerConfigurationException(err.toString());            }        }        catch (ClassFormatError e) {            ErrorMsg err = new ErrorMsg(ErrorMsg.TRANSLET_CLASS_ERR, _name);            throw new TransformerConfigurationException(err.toString());        }        catch (LinkageError e) {            ErrorMsg err = new ErrorMsg(ErrorMsg.TRANSLET_OBJECT_ERR, _name);            throw new TransformerConfigurationException(err.toString());        }    }

经验总结扩展阅读