如何将 (java.lang.Class) Class 转换为通过反射获得的 Class
How to cast a (java.lang.Class) Class to a Class obtained with reflection
我正在尝试构建一个模块来管理我的数据库的目录,例如:国家、企业、用户等。用户应该 select 来自组合框的目录并且系统应该显示table 与主要列(在数据库中不为空,一些由我预定义)。在这 3 个目标中,我只实现了 2 个:
1.- 在使用反射 selecting 目录后从实体 类 获取 @NotNull
字段
2.-显示带有动态列的 table 也从上面检索它们。
但是 3 号给我带来了麻烦。问题是,我在视图中使用以下代码动态显示列(基于我存储在对象中的 @NotNull
字段),(https://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml):
<p:dataTable id="conceptos" var="pojo" value="#{catalogoMB.comocombo}>
<p:columns value="#{catalogoMB.columns}" var="column"
columnIndexVar="colIndex" sortBy="#{pojo[column.property]}" filterBy="#
{pojo[column.property]}">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{pojo[column.property]}" />
</p:columns>
</p:dataTable>
因此,例如,在没有反射的情况下,以正常方式,上面的代码将像这样工作:
comcombo 将具有以下属性:name、value、id;我的列数组将是相同的:名称、值、ID ...
问题是,comocombo
是一个 List<Object>
对象,我在其中存储字段的反射 class 值,returns java.lang.class 而不是 EntityClass 的实例,尽管我管理从 class (组合)的对象实例调用 setter 和 getter - 据说 -
因此,当我尝试显示 pojo[column.property]
-> comcombo["id"]、comcombo["name"] 或 comcombo["value"] 时,它向我发送了一个异常,指出 java.lang.class
没有此任何属性....我怎样才能找到它们?我读过 Map<String, String>
和 .cast()
但我不确定这是否可行。
public void populateT(){
comocombo=new ArrayList<>();
Object tt ;
y = tabla.get(tabla.size()-1).getConcpetos(); //result of query type:
FindAll from the entity Class
try{
Class combito= Class.forName("sipe.services."+ catName); //the "path" of the
Entity Classes
for (Integer j=0; j<y.size()-1; j++){
tt=y.get(j);
for (Integer i=0; i< tabla.size()-1; i++){
tucampo=minustomayus(y.get(j).getClass().getDeclaredField(tabla.get(i).getNombre_c()).getName()); //tabla.get(i).getNombre_c()-> here I've stored the @NotNull properties' names (countryid, countryname...) whic are the same in columns = new ArrayList<ColumnModel>(); (catalogoMB.columns in the view)
Class cls= Class.forName("sipe.services."+ catName);
Method method = cls.getDeclaredMethod("get"+tucampo); // for example "countryid" -> getCountryid
Class<?> type = null;
for (Method methods : combito.getDeclaredMethods())
{ //Here I'm trying to invoke setter of the Entity Class in order to store its values..
//equivalent to: if o is an instance of Entity Class Country: Country o = new Country(); o.setCountryid(2);
if (methods.getName().contains("set"+tucampo)){
type=method.getReturnType();
methods.invoke(combito.newInstance(),method.invoke(tt));
}
}
我的就是这样工作的,希望对你有帮助
private void createDynamicColumns(){
//split column templates
String[] columnKeys = columnTemplate.split(" ");
//set first list to null
//this should be a List with no type specified
//eg List objects = new ArrayList<>();
//since you will dynamically populate it based on what the user selects from combobox
objects = null;
//clear columns
columns.clear();
//create a class from combobox selection
Class<?> forName = Class.forName("pathToClass." + comboboxSelection);
//get declared fields in that class
List<Field> asList = Arrays.asList(forName.getDeclaredFields());
//for each columkeys
//if method.getName() can be found in columnKeys
//add that columnKey to the new columnList;
for(int i =0;i< asList.size();i++)
for (String columnKey : columnKeys) {
String fieldName = asList.get(i).getName();
if (columnKey.equalsIgnoreCase(fieldName)) {
columns.add(fieldName);
}
}
//fetch from the database the objects list
objects = DAO.findAll();
}
和 facelets 页面
<p:dataTable var="object" value="#{backingBean.objects}">
<p:columns value="#{BackingBean.columns}" var="column">
<f:facet name="header">
<h:outputText value="#{column}" />
</f:facet>
<h:outputText value="#{object[column]}" />
</p:columns>
</p:dataTable>
记得处理异常
我正在尝试构建一个模块来管理我的数据库的目录,例如:国家、企业、用户等。用户应该 select 来自组合框的目录并且系统应该显示table 与主要列(在数据库中不为空,一些由我预定义)。在这 3 个目标中,我只实现了 2 个:
1.- 在使用反射 selecting 目录后从实体 类 获取 @NotNull
字段
2.-显示带有动态列的 table 也从上面检索它们。
但是 3 号给我带来了麻烦。问题是,我在视图中使用以下代码动态显示列(基于我存储在对象中的 @NotNull
字段),(https://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml):
<p:dataTable id="conceptos" var="pojo" value="#{catalogoMB.comocombo}>
<p:columns value="#{catalogoMB.columns}" var="column"
columnIndexVar="colIndex" sortBy="#{pojo[column.property]}" filterBy="#
{pojo[column.property]}">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{pojo[column.property]}" />
</p:columns>
</p:dataTable>
因此,例如,在没有反射的情况下,以正常方式,上面的代码将像这样工作:
comcombo 将具有以下属性:name、value、id;我的列数组将是相同的:名称、值、ID ...
问题是,comocombo
是一个 List<Object>
对象,我在其中存储字段的反射 class 值,returns java.lang.class 而不是 EntityClass 的实例,尽管我管理从 class (组合)的对象实例调用 setter 和 getter - 据说 -
因此,当我尝试显示 pojo[column.property]
-> comcombo["id"]、comcombo["name"] 或 comcombo["value"] 时,它向我发送了一个异常,指出 java.lang.class
没有此任何属性....我怎样才能找到它们?我读过 Map<String, String>
和 .cast()
但我不确定这是否可行。
public void populateT(){
comocombo=new ArrayList<>();
Object tt ;
y = tabla.get(tabla.size()-1).getConcpetos(); //result of query type:
FindAll from the entity Class
try{
Class combito= Class.forName("sipe.services."+ catName); //the "path" of the
Entity Classes
for (Integer j=0; j<y.size()-1; j++){
tt=y.get(j);
for (Integer i=0; i< tabla.size()-1; i++){
tucampo=minustomayus(y.get(j).getClass().getDeclaredField(tabla.get(i).getNombre_c()).getName()); //tabla.get(i).getNombre_c()-> here I've stored the @NotNull properties' names (countryid, countryname...) whic are the same in columns = new ArrayList<ColumnModel>(); (catalogoMB.columns in the view)
Class cls= Class.forName("sipe.services."+ catName);
Method method = cls.getDeclaredMethod("get"+tucampo); // for example "countryid" -> getCountryid
Class<?> type = null;
for (Method methods : combito.getDeclaredMethods())
{ //Here I'm trying to invoke setter of the Entity Class in order to store its values..
//equivalent to: if o is an instance of Entity Class Country: Country o = new Country(); o.setCountryid(2);
if (methods.getName().contains("set"+tucampo)){
type=method.getReturnType();
methods.invoke(combito.newInstance(),method.invoke(tt));
}
}
我的就是这样工作的,希望对你有帮助
private void createDynamicColumns(){
//split column templates
String[] columnKeys = columnTemplate.split(" ");
//set first list to null
//this should be a List with no type specified
//eg List objects = new ArrayList<>();
//since you will dynamically populate it based on what the user selects from combobox
objects = null;
//clear columns
columns.clear();
//create a class from combobox selection
Class<?> forName = Class.forName("pathToClass." + comboboxSelection);
//get declared fields in that class
List<Field> asList = Arrays.asList(forName.getDeclaredFields());
//for each columkeys
//if method.getName() can be found in columnKeys
//add that columnKey to the new columnList;
for(int i =0;i< asList.size();i++)
for (String columnKey : columnKeys) {
String fieldName = asList.get(i).getName();
if (columnKey.equalsIgnoreCase(fieldName)) {
columns.add(fieldName);
}
}
//fetch from the database the objects list
objects = DAO.findAll();
}
和 facelets 页面
<p:dataTable var="object" value="#{backingBean.objects}">
<p:columns value="#{BackingBean.columns}" var="column">
<f:facet name="header">
<h:outputText value="#{column}" />
</f:facet>
<h:outputText value="#{object[column]}" />
</p:columns>
</p:dataTable>
记得处理异常