public class ExtensionRegistry extends ExtensionRegistryLite
ExtensionRegistry
in which you have registered any extensions
that you want to be able to parse. Otherwise, those extensions will just
be treated like unknown fields.
For example, if you had the .proto
file:
option java_class = "MyProto"; message Foo { extensions 1000 to max; } extend Foo { optional int32 bar; }Then you might write code like:
ExtensionRegistry registry = ExtensionRegistry.newInstance(); registry.add(MyProto.bar); MyProto.Foo message = MyProto.Foo.parseFrom(input, registry);
Background:
You might wonder why this is necessary. Two alternatives might come to mind. First, you might imagine a system where generated extensions are automatically registered when their containing classes are loaded. This is a popular technique, but is bad design; among other things, it creates a situation where behavior can change depending on what classes happen to be loaded. It also introduces a security vulnerability, because an unprivileged class could cause its code to be called unexpectedly from a privileged class by registering itself as an extension of the right type.
Another option you might consider is lazy parsing: do not parse an extension until it is first requested, at which point the caller must provide a type to use. This introduces a different set of problems. First, it would require a mutex lock any time an extension was accessed, which would be slow. Second, corrupt data would not be detected until first access, at which point it would be much harder to deal with it. Third, it could violate the expectation that message objects are immutable, since the type provided could be any arbitrary message class. An unprivileged user could take advantage of this to inject a mutable object into a message belonging to privileged code and create mischief.
Modifier and Type | Class and Description |
---|---|
private static class |
ExtensionRegistry.DescriptorIntPair
A (GenericDescriptor, int) pair, used as a map key.
|
static class |
ExtensionRegistry.ExtensionInfo
A (Descriptor, Message) pair, returned by lookup methods.
|
Modifier and Type | Field and Description |
---|---|
(package private) static ExtensionRegistry |
EMPTY_REGISTRY |
private java.util.Map<java.lang.String,ExtensionRegistry.ExtensionInfo> |
immutableExtensionsByName |
private java.util.Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> |
immutableExtensionsByNumber |
private java.util.Map<java.lang.String,ExtensionRegistry.ExtensionInfo> |
mutableExtensionsByName |
private java.util.Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> |
mutableExtensionsByNumber |
EMPTY_REGISTRY_LITE, EXTENSION_CLASS_NAME
Modifier | Constructor and Description |
---|---|
private |
ExtensionRegistry() |
(package private) |
ExtensionRegistry(boolean empty) |
private |
ExtensionRegistry(ExtensionRegistry other) |
Modifier and Type | Method and Description |
---|---|
void |
add(Descriptors.FieldDescriptor type)
Add a non-message-type extension to the registry by descriptor.
|
void |
add(Descriptors.FieldDescriptor type,
Message defaultInstance)
Add a message-type extension to the registry by descriptor.
|
void |
add(Extension<?,?> extension)
Add an extension from a generated file to the registry.
|
private void |
add(ExtensionRegistry.ExtensionInfo extension,
Extension.ExtensionType extensionType) |
void |
add(GeneratedMessage.GeneratedExtension<?,?> extension)
Add an extension from a generated file to the registry.
|
ExtensionRegistry.ExtensionInfo |
findExtensionByName(java.lang.String fullName)
Deprecated.
|
ExtensionRegistry.ExtensionInfo |
findExtensionByNumber(Descriptors.Descriptor containingType,
int fieldNumber)
Deprecated.
|
ExtensionRegistry.ExtensionInfo |
findImmutableExtensionByName(java.lang.String fullName)
Find an extension for immutable APIs by fully-qualified field name,
in the proto namespace.
|
ExtensionRegistry.ExtensionInfo |
findImmutableExtensionByNumber(Descriptors.Descriptor containingType,
int fieldNumber)
Find an extension by containing type and field number for immutable APIs.
|
ExtensionRegistry.ExtensionInfo |
findMutableExtensionByName(java.lang.String fullName)
Find an extension for mutable APIs by fully-qualified field name,
in the proto namespace.
|
ExtensionRegistry.ExtensionInfo |
findMutableExtensionByNumber(Descriptors.Descriptor containingType,
int fieldNumber)
Find an extension by containing type and field number for mutable APIs.
|
java.util.Set<ExtensionRegistry.ExtensionInfo> |
getAllImmutableExtensionsByExtendedType(java.lang.String fullName)
Find all extensions for immutable APIs by fully-qualified name of
extended class.
|
java.util.Set<ExtensionRegistry.ExtensionInfo> |
getAllMutableExtensionsByExtendedType(java.lang.String fullName)
Find all extensions for mutable APIs by fully-qualified name of
extended class.
|
static ExtensionRegistry |
getEmptyRegistry()
Get the unmodifiable singleton empty instance.
|
ExtensionRegistry |
getUnmodifiable()
Returns an unmodifiable view of the registry.
|
(package private) static ExtensionRegistry.ExtensionInfo |
newExtensionInfo(Extension<?,?> extension) |
static ExtensionRegistry |
newInstance()
Construct a new, empty instance.
|
add, add, findLiteExtensionByNumber, isEagerlyParseMessageSets, resolveExtensionClass, setEagerlyParseMessageSets
private final java.util.Map<java.lang.String,ExtensionRegistry.ExtensionInfo> immutableExtensionsByName
private final java.util.Map<java.lang.String,ExtensionRegistry.ExtensionInfo> mutableExtensionsByName
private final java.util.Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> immutableExtensionsByNumber
private final java.util.Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> mutableExtensionsByNumber
static final ExtensionRegistry EMPTY_REGISTRY
private ExtensionRegistry()
private ExtensionRegistry(ExtensionRegistry other)
ExtensionRegistry(boolean empty)
public static ExtensionRegistry newInstance()
public static ExtensionRegistry getEmptyRegistry()
public ExtensionRegistry getUnmodifiable()
getUnmodifiable
in class ExtensionRegistryLite
public ExtensionRegistry.ExtensionInfo findExtensionByName(java.lang.String fullName)
findImmutableExtensionByName(String)
instead.public ExtensionRegistry.ExtensionInfo findImmutableExtensionByName(java.lang.String fullName)
result.descriptor.fullName()
will
match fullName
if a match is found.null
otherwise.public ExtensionRegistry.ExtensionInfo findMutableExtensionByName(java.lang.String fullName)
result.descriptor.fullName()
will
match fullName
if a match is found.null
otherwise.public ExtensionRegistry.ExtensionInfo findExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber)
findImmutableExtensionByNumber(
Descriptors.Descriptor, int)
public ExtensionRegistry.ExtensionInfo findImmutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber)
null
otherwise.public ExtensionRegistry.ExtensionInfo findMutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber)
null
otherwise.public java.util.Set<ExtensionRegistry.ExtensionInfo> getAllMutableExtensionsByExtendedType(java.lang.String fullName)
null
if there
are none.public java.util.Set<ExtensionRegistry.ExtensionInfo> getAllImmutableExtensionsByExtendedType(java.lang.String fullName)
null
if there
are none.public void add(Extension<?,?> extension)
public void add(GeneratedMessage.GeneratedExtension<?,?> extension)
static ExtensionRegistry.ExtensionInfo newExtensionInfo(Extension<?,?> extension)
public void add(Descriptors.FieldDescriptor type)
public void add(Descriptors.FieldDescriptor type, Message defaultInstance)
private void add(ExtensionRegistry.ExtensionInfo extension, Extension.ExtensionType extensionType)