Class ExtensionRegistry
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.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final classA (GenericDescriptor, int) pair, used as a map key.static final classA (Descriptor, Message) pair, returned by lookup methods. -
Field Summary
FieldsModifier and TypeFieldDescription(package private) static final ExtensionRegistryprivate final Map<String,ExtensionRegistry.ExtensionInfo> private final Map<String,ExtensionRegistry.ExtensionInfo> Fields inherited from class com.google.protobuf.ExtensionRegistryLite
EMPTY_REGISTRY_LITE, EXTENSION_CLASS_NAME -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidAdd a non-message-type extension to the registry by descriptor.voidadd(Descriptors.FieldDescriptor type, Message defaultInstance) Add a message-type extension to the registry by descriptor.voidAdd an extension from a generated file to the registry.private voidadd(ExtensionRegistry.ExtensionInfo extension, Extension.ExtensionType extensionType) voidadd(GeneratedMessage.GeneratedExtension<?, ?> extension) Add an extension from a generated file to the registry.findExtensionByName(String fullName) Deprecated.findExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Deprecated.findImmutableExtensionByName(String fullName) Find an extension for immutable APIs by fully-qualified field name, in the proto namespace.findImmutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Find an extension by containing type and field number for immutable APIs.findMutableExtensionByName(String fullName) Find an extension for mutable APIs by fully-qualified field name, in the proto namespace.findMutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Find an extension by containing type and field number for mutable APIs.Find all extensions for immutable APIs by fully-qualified name of extended class.getAllMutableExtensionsByExtendedType(String fullName) Find all extensions for mutable APIs by fully-qualified name of extended class.static ExtensionRegistryGet the unmodifiable singleton empty instance.Returns an unmodifiable view of the registry.(package private) static ExtensionRegistry.ExtensionInfonewExtensionInfo(Extension<?, ?> extension) static ExtensionRegistryConstruct a new, empty instance.Methods inherited from class com.google.protobuf.ExtensionRegistryLite
add, add, findLiteExtensionByNumber, isEagerlyParseMessageSets, setEagerlyParseMessageSets
-
Field Details
-
immutableExtensionsByName
-
mutableExtensionsByName
-
immutableExtensionsByNumber
private final Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> immutableExtensionsByNumber -
mutableExtensionsByNumber
private final Map<ExtensionRegistry.DescriptorIntPair,ExtensionRegistry.ExtensionInfo> mutableExtensionsByNumber -
EMPTY_REGISTRY
-
-
Constructor Details
-
ExtensionRegistry
private ExtensionRegistry() -
ExtensionRegistry
-
ExtensionRegistry
ExtensionRegistry(boolean empty)
-
-
Method Details
-
newInstance
Construct a new, empty instance. -
getEmptyRegistry
Get the unmodifiable singleton empty instance. -
getUnmodifiable
Returns an unmodifiable view of the registry.- Overrides:
getUnmodifiablein classExtensionRegistryLite
-
findExtensionByName
Deprecated.Deprecated. UsefindImmutableExtensionByName(String)instead. -
findImmutableExtensionByName
Find an extension for immutable APIs by fully-qualified field name, in the proto namespace. i.e.result.descriptor.fullName()will matchfullNameif a match is found.- Returns:
- Information about the extension if found, or
nullotherwise.
-
findMutableExtensionByName
Find an extension for mutable APIs by fully-qualified field name, in the proto namespace. i.e.result.descriptor.fullName()will matchfullNameif a match is found.- Returns:
- Information about the extension if found, or
nullotherwise.
-
findExtensionByNumber
@Deprecated public ExtensionRegistry.ExtensionInfo findExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Deprecated.Deprecated. UsefindImmutableExtensionByNumber(Descriptors.Descriptor, int) -
findImmutableExtensionByNumber
public ExtensionRegistry.ExtensionInfo findImmutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Find an extension by containing type and field number for immutable APIs.- Returns:
- Information about the extension if found, or
nullotherwise.
-
findMutableExtensionByNumber
public ExtensionRegistry.ExtensionInfo findMutableExtensionByNumber(Descriptors.Descriptor containingType, int fieldNumber) Find an extension by containing type and field number for mutable APIs.- Returns:
- Information about the extension if found, or
nullotherwise.
-
getAllMutableExtensionsByExtendedType
Find all extensions for mutable APIs by fully-qualified name of extended class. Note that this method is more computationally expensive than getting a single extension by name or number.- Returns:
- Information about the extensions found, or
nullif there are none.
-
getAllImmutableExtensionsByExtendedType
public Set<ExtensionRegistry.ExtensionInfo> getAllImmutableExtensionsByExtendedType(String fullName) Find all extensions for immutable APIs by fully-qualified name of extended class. Note that this method is more computationally expensive than getting a single extension by name or number.- Returns:
- Information about the extensions found, or
nullif there are none.
-
add
Add an extension from a generated file to the registry. -
add
Add an extension from a generated file to the registry. -
newExtensionInfo
-
add
Add a non-message-type extension to the registry by descriptor. -
add
Add a message-type extension to the registry by descriptor. -
add
-