Você está se referindo a uma tag do JavaServer Faces, não é?
Por que se for, prepare-se que a solução é cascuda!
Primeiro, faça um binding no dataTable, ou seja, faça com que o componente seja gerenciável através de um ManagedBean. Assim:
<h:dataTable binding="#{tableData.component}" value="#{tableData.names}" var="name">
...
</h:dataTable>
Essa propriedade ‘component’ será definida no seu managed bean assim:
import javax.faces.component.*;
public class TableData {
private UIData component = null;
// outros atributos
public UIData getComponent() {
return component;
}
public void setComponent(UIData component) {
this.component = component;
}
// outros métodos
}
Agora, quando renderizar o dataTable, o Faces vai olhar a propriedade component pra ver se retorna algum componente, na primeira vez retorna null, então ele vai criar um UIData (na verdade um filho deste) e setar na propriedade component. Se o managed bean for de sessão, nas próximas vezes, como o get não retorna null, será usado este mesmo componente sem criar um novo.
Bom, com o managed bean tendo acesso ao componente, basta pegar o valor do cabeçalho da coluna lembrando que: os filhos de UIData são UIColumn, e cada UIColumn pode ter um header representado por UIOutput. Veja como eu pego os nomes de coluna abaixo:
public String getColumnNames() {
// pego os filhos do componente dataTable, são todos UIColumn,
// mas o método retorna UIComponent
List<UIComponent> children = component.getChildren();
StringBuilder buffer = new StringBuilder();
// itero sobre a lista de componentes, filhos de tableData
for (UIComponent child : children) {
// cast para UIColumn
UIColumn column = (UIColumn) child;
// pego o header do column, e converto para UIOutput
UIOutput outputHeader = (UIOutput) column.getHeader();
// chamo o getvalue() do outputHeader para obter seu valor
buffer.append(outputHeader.getValue()).append(',');
}
return buffer.toString();
}
Era isso a sua dúvida?