java 如何使用反射从 POJO 获取属性名称和值?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12847954/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can use reflection to get the property names and values from a POJO?
提问by cbmeeks
So I'm writing an "POJO to JSON" converter. I want to be able to pass in a List<T>
object and convert to JSON.
所以我正在编写一个“POJO to JSON”转换器。我希望能够传入一个List<T>
对象并转换为 JSON。
Hopefully this will make sense
希望这会有意义
/**
*
* NOT COMPLETE!!! OBVIOUSLY!!!
*/
public abstract class Jsonator<T> implements Serializable {
private Class<T> entityClass;
private JSONObject json;
private JSONArray jsonArray;
public Jsonator(Class<T> entityClass) {
this.entityClass = entityClass;
}
public void convert(List<T> paObjectList) throws IllegalArgumentException, IllegalAccessException {
json = new JSONObject();
jsonArray = new JSONArray();
try {
for (Object obj : paObjectList) {
JSONObject objJson = new JSONObject();
Class<?> kls = obj.getClass();
Field[] fields = kls.getFields();
for (Field field : fields) {
objJson.put(field.getName(), (T) field.get(obj));
}
jsonArray.add(objJson);
}
json.put("results", jsonArray);
}
catch (Exception ex) {
}
}
public String error() {
return "ERROR";
}
public String results() {
if (json != null) {
return json.toJSONString();
}
return "[]";
}
}
When I get to the Object obj
section, my obj
is correct. I can debug it and see the name and value of the class.
当我到达该Object obj
部分时,我obj
是正确的。我可以调试它并查看类的名称和值。
Let's say that class is this:
假设这个类是这样的:
public class User {
private firstName;
private lastName;
... getters....setters....etc...
}
So that now, obj
is a Site.
OK, I then try to get the field names (firstName, lastName) but the fields object is empty.
所以现在,obj
是一个站点。好的,然后我尝试获取字段名称(firstName、lastName)但字段对象为空。
What am I doing wrong?
我究竟做错了什么?
Thanks
谢谢
EDIT
编辑
I got it to work! This is not finished code, but it's doing exactly what I want for now. I've read that Google and Hymanson will do this too. If someone can provide a good link on how to selectively pick properties from a POJO, then I'm all ears.
我让它工作了!这不是完成的代码,但它正在做我现在想要的。我读过谷歌和Hyman逊也会这样做。如果有人可以提供有关如何有选择地从 POJO 中选择属性的良好链接,那么我会全力以赴。
Or better yet, I'd like to know WHYI shouldn't be doing this, this way?
或者更好的是,我想知道为什么我不应该这样做?
Thanks!
谢谢!
Jsonator (NOT FINISHED)
Jsonator(未完成)
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
/**
*
* @author Cecil.Meeks
*/
public abstract class Jsonator<T> implements Serializable {
private Class<T> entityClass;
private JSONObject json;
private JSONArray jsonArray;
public Jsonator(Class<T> entityClass) {
this.entityClass = entityClass;
}
public void convert(List<T> paObjectList) throws IllegalArgumentException, IllegalAccessException {
json = new JSONObject();
jsonArray = new JSONArray();
try {
for (Object obj : paObjectList) {
JSONObject objJson = new JSONObject();
Class<?> kls = obj.getClass();
Field[] fields = kls.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
objJson.put(field.getName(), field.get(obj));
}
jsonArray.add(objJson);
}
json.put("results", jsonArray);
}
catch (SecurityException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public String error() {
return "ERROR";
}
public String results() {
if (json != null) {
return json.toJSONString();
}
return "[]";
}
}
Site Class
站点类
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "Sites")
public class Site implements Serializable {
private String siteKey;
private String site;
private String siteType;
private String address1;
private String address2;
private String city;
private String zipCode;
private String createdBy;
private String glCode;
public Site() {
}
@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
public String getSiteKey() {
return siteKey;
}
public void setSiteKey(String siteKey) {
this.siteKey = siteKey;
}
@Column(name = "Site", unique = true, length = 125, nullable = false)
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
@Column(name = "SiteType", unique = false, length = 8, nullable = true)
public String getSiteType() {
return siteType;
}
public void setSiteType(String siteType) {
this.siteType = siteType;
}
@Column(name = "Address1", unique = false, length = 125, nullable = true)
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
@Column(name = "Address2", unique = false, length = 125, nullable = true)
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
@Column(name = "City", unique = false, length = 125, nullable = true)
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Column(name = "ZipCode", unique = false, length = 50, nullable = true)
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
@Column(name = "CreatedBy", unique = false, length = 125, nullable = true)
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
@Column(name = "GLCode", unique = false, length = 11, nullable = true)
public String getGlCode() {
return glCode;
}
public void setGlCode(String glCode) {
this.glCode = glCode;
}
}
EXAMPLE
例子
public class SiteJsonator extends Jsonator<Site> {
public SiteJsonator() {
super(Site.class);
}
}
@Controller
@RequestMapping(value = "/sites")
public class SitesController {
@Autowired
private SiteService siteService;
@RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public String index(ModelMap map) {
SiteJsonator list = new SiteJsonator();;
try {
list.convert(siteService.getAll());
return list.results();
}
catch (Exception ex) {
return list.error();
}
}
}
UPDATE 2
更新 2
Here is the better Jsonator
for those interested:
Jsonator
对于感兴趣的人来说,这是更好的:
https://gist.github.com/3893242
https://gist.github.com/3893242
You can pass in an "exclude" String[] and it will not include those. Plus, it has a standard "results, message, etc" that we like to pass back in our AJAX requests. Good for ExtJS.
您可以传入一个“排除” String[] 并且它不会包含那些。另外,它有一个标准的“结果、消息等”,我们喜欢在我们的 AJAX 请求中传回它。适合 ExtJS。
回答by Keppil
You need to use #getDeclaredFields()
to include private fields, #getFields()
only lists the public ones.
您需要使用#getDeclaredFields()
来包含私有字段,#getFields()
只列出公共字段。
With private
fields you will also run into access restriction problems, so you probably want to look into the Field#setAccessible()
method as well.
对于private
字段,您还会遇到访问限制问题,因此您可能还想研究该Field#setAccessible()
方法。
回答by iDroid
Instead of kls.getfields you could need to use kls.getDeclaredFields() . And if Jason object is your concern I had recommend you a Hymanson Codhaus library . In which you can get or set JsonString from your POJO... HTH
您可能需要使用 kls.getDeclaredFields() 而不是 kls.getfields 。如果您担心 Jason 对象,我会向您推荐 Hymanson Codhaus 图书馆。您可以在其中从 POJO 获取或设置 JsonString ... HTH