public static AjAttribute read(String name, byte[] bytes, ISourceContext context,IMessageHandler msgHandler) {
public static AjAttribute read(AjAttribute.WeaverVersionInfo v, String name, byte[] bytes, ISourceContext context,IMessageHandler msgHandler) {
	public static AjAttribute read(String name, byte[] bytes, ISourceContext context,IMessageHandler msgHandler) {		try {			if (bytes == null) bytes = new byte[0];			DataInputStream s = new DataInputStream(new ByteArrayInputStream(bytes));			if (name.equals(Aspect.AttributeName)) {				return new Aspect(PerClause.readPerClause(s, context));			} else if (name.equals(MethodDeclarationLineNumberAttribute.AttributeName)) {			   return MethodDeclarationLineNumberAttribute.read(s);			} else if (name.equals(WeaverState.AttributeName)) {				return new WeaverState(WeaverStateInfo.read(s, context));			} else if (name.equals(WeaverVersionInfo.AttributeName)) {				return WeaverVersionInfo.read(s);			} else if (name.equals(AdviceAttribute.AttributeName)) {				return AdviceAttribute.read(s, context);			} else if (name.equals(PointcutDeclarationAttribute.AttributeName)) {				return new PointcutDeclarationAttribute(ResolvedPointcutDefinition.read(s, context));			} else if (name.equals(TypeMunger.AttributeName)) {				return new TypeMunger(ResolvedTypeMunger.read(s, context));			} else if (name.equals(AjSynthetic.AttributeName)) {				return new AjSynthetic();			} else if (name.equals(DeclareAttribute.AttributeName)) {				return new DeclareAttribute(Declare.read(s, context));			} else if (name.equals(PrivilegedAttribute.AttributeName)) {				return PrivilegedAttribute.read(s, context);			} else if (name.equals(SourceContextAttribute.AttributeName)) {				return SourceContextAttribute.read(s);			} else if (name.equals(EffectiveSignatureAttribute.AttributeName)) {				return EffectiveSignatureAttribute.read(s, context);			} else {				// We have to tell the user about this...				if (msgHandler == null) throw new BCException("unknown attribute" + name);				msgHandler.handleMessage(MessageUtil.warn("unknown attribute encountered "+name));				return null;			}		} catch (IOException e) {			throw new BCException("malformed " + name + " attribute " + e);		}	}