# 修改属性

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ops/modattrs.html](https://docs.oracle.com/javase/tutorial/jndi/ops/modattrs.html)

[`DirContext` ](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html)接口包含用于修改目录中对象的属性和属性值的方法。

 [`ModificationItem` ](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/ModificationItem.html)）。每个 `ModificationItem` 包含一个数字常量，表示要进行的修改类型， [`属性`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/Attribute.html) 描述要进行的修改。以下是三种类型的修改：

*   [ADD_ATTRIBUTE](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#ADD_ATTRIBUTE)
*   [REPLACE_ATTRIBUTE](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#REPLACE_ATTRIBUTE)
*   [REMOVE_ATTRIBUTE](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#REMOVE_ATTRIBUTE)

修改按它们在列表中出现的顺序应用。要么执行所有修改，要么都不执行。

以下代码创建了一个修改列表。它将`“mail”`属性的值替换为值`“geisel@wizards.com”`，为`“telephonenumber”`属性添加一个附加值，并且删除`“jpegphoto”`属性。

```
// Specify the changes to make
ModificationItem[] mods = new ModificationItem[3];

// Replace the "mail" attribute with a new value
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
    new BasicAttribute("mail", "geisel@wizards.com"));

// Add an additional value to "telephonenumber"
mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE,
    new BasicAttribute("telephonenumber", "+1 555 555 5555"));

// Remove the "jpegphoto" attribute
mods[2] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
    new BasicAttribute("jpegphoto"));

```

* * *

**Windows Active Directory：** Active Directory 将“telephonenumber”定义为单值属性，与 [RFC 2256](http://www.ietf.org/rfc/rfc2256.txt) 相反。要使此示例针对 Active Directory 工作，您必须使用“telephonenumber”以外的属性，或者将 `DirContext.ADD_ATTRIBUTE` 更改为 `DirContext.REPLACE_ATTRIBUTE` 。

* * *

创建此修改列表后，您可以将其提供给 [`modifyAttributes（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#modifyAttributes-javax.naming.Name-javax.naming.directory.ModificationItem:A-) ，如下所示。

```
// Perform the requested modifications on the named object
ctx.modifyAttributes(name, mods);

```

或者，您可以通过指定修改类型和要应用修改的属性来执行修改。

例如，以下行将与`名称`相关联的属性（在 `orig` 中标识）替换为 `orig` 中的属性：

```
ctx.modifyAttributes(name, DirContext.REPLACE_ATTRIBUTE, orig);

```

`名称`的任何其他属性保持不变。

在 [`the sample program`](examples/ModAttrs.java )中证明了 `modifyAttributes（）`的这两种用途。此程序通过使用修改列表修改属性，然后使用 `modifyAttributes（）`的第二种形式来恢复原始属性。