Reputation: 69
I am using Jooq in application and i am using a comparator and my code is omething like this
public void columnsList(List<TableRecord> records){
Collections.sort(records, new StampDateComparator());
for(TableRecord record : records){
Table table = record.getTable();
Field[] fields = table.fields();
for(Field field : fields){
field.getName();
record.getValue(field);
}
}
}
and Comparator class method is something like this
@Override
public int compare(Object o1, Object o2) {
try {
Date d1 = (Date) o1.getClass().getDeclaredField("StampDate").get(o1);
Date d2 = (Date) o2.getClass().getDeclaredField("StampDate").get(o2);
return compare(d1, d2);
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException("Missing variable stampDate");
}catch (ClassCastException e) {
throw new RuntimeException("stampDate is not a Date");
} catch (IllegalArgumentException e) {
//shoud not happen
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
But this line of code
Date d1 = (Date) o1.getClass().getDeclaredField("StampDate").get(o1);
java.lang.NoSuchFieldException: StampDate at java.lang.Class.getDeclaredField(Unknown Source) at com.csdcsystems.amanda.comp.macro.StampDateComparator.compare(StampDateComparator.java:13) at java.util.TimSort.countRunAndMakeAscending(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source)
What i am doing wrong here?
For your refrence o1
contain field something like this
|PeopleRSN|NameTitle|NameFirst|NameLast|OrganizationName|AddrHouse|AddrStreet|AddrStreetType|AddrStreetDirection|AddrUnitType|AddrUnit|AddrCity|AddrProvince|AddrCountry|AddrPostal|Phone1|Phone1Desc|Phone2|Phone2Desc|LicenceNumber|PeopleCode|ContactSex|BirthDate|FamilyRSN|Comments|StampDate|StampUser|AddrPrefix|AddressLine1|AddressLine2|AddressLine3|AddressLine4|AddressLine5|AddressLine6|AddrHouseNumeric|Phone3|Phone3Desc|EmailAddress|NameFirstUpper|NameLastUpper|OrgNameUpper|AddrStreetUpper|AddrStreetPrefix|ParentRSN|SecurityCode|LogType|LogUser|LogDate|ReferenceFile|StatusCode|Nearby|Community|Phone4|Phone4Desc|InternetPassword|InternetAccess|LogDbDate|InternetRegistrationDate|STATUSTYPE|INTERNETQUESTION|INTERNETANSWER|CREDITCARDPROCESSINGFLAG|WEBDISPLAYFLAG|NameMiddle|NameSuffix|AddrCommunityCode|AddrCountyCode|NameMiddleUpper|SMSFlag|EmailFlag|NameLast1|AliasRSN|PeopleRoleType|PeopleRaceType|PeopleHairType|PeopleEyeType|SEX |Height|HeightInch|Weight|SocialSecurityNumber|LicenceNumberProvince|ConversionFlag|
| {null}|{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null}|{null} |{null}|{null} |{null} | {null}|{null} |{null} | {null}|{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} | {null}|{null}|{null} |{null} |{null} |{null} |{null} |{null} |{null} | {null}| {null}|{null} |{null} |{null} |{null} | {null}|{null}|{null} |{null}|{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} |{null} | {null}| {null}|{null} |{null} |{null} |{null} | {null}|{null} |{null} |{null} |{null} |{null}|{null}| {null}|{null}|{null} |{null} |{null} |
Edit :-
/**
* This class is generated by jOOQ.
*/
@java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" })
@javax.persistence.Entity
@javax.persistence.Table(name = "LogFolder", schema = "amanda")
public class LogFolderRecord extends org.jooq.impl.UpdatableRecordImpl<com.csdcsystems.schema.amanda.records.LogFolderRecord> {
private static final long serialVersionUID = -673142359;
/**
* Setter for <code>amanda.LogFolder.FolderRSN</code>.
*/
public void setFolderRSN(java.lang.Integer value) {
setValue(0, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderRSN</code>.
*/
@javax.persistence.Id
@javax.persistence.Column(name = "FolderRSN", unique = true, nullable = false, precision = 10)
@javax.validation.constraints.NotNull
public java.lang.Integer getFolderRSN() {
return (java.lang.Integer) getValue(0);
}
/**
* Setter for <code>amanda.LogFolder.FolderYear</code>.
*/
public void setFolderYear(java.lang.String value) {
setValue(1, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderYear</code>.
*/
@javax.persistence.Column(name = "FolderYear", nullable = false, length = 4)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Size(max = 4)
public java.lang.String getFolderYear() {
return (java.lang.String) getValue(1);
}
/**
* Setter for <code>amanda.LogFolder.FolderSequence</code>.
*/
public void setFolderSequence(java.lang.String value) {
setValue(2, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderSequence</code>.
*/
@javax.persistence.Column(name = "FolderSequence", nullable = false, length = 10)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Size(max = 10)
public java.lang.String getFolderSequence() {
return (java.lang.String) getValue(2);
}
/**
* Setter for <code>amanda.LogFolder.FolderSection</code>.
*/
public void setFolderSection(java.lang.String value) {
setValue(3, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderSection</code>.
*/
@javax.persistence.Column(name = "FolderSection", nullable = false, length = 3)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Size(max = 3)
public java.lang.String getFolderSection() {
return (java.lang.String) getValue(3);
}
/**
* Setter for <code>amanda.LogFolder.FolderRevision</code>.
*/
public void setFolderRevision(java.lang.String value) {
setValue(4, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderRevision</code>.
*/
@javax.persistence.Column(name = "FolderRevision", nullable = false, length = 2)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Size(max = 2)
public java.lang.String getFolderRevision() {
return (java.lang.String) getValue(4);
}
/**
* Setter for <code>amanda.LogFolder.FolderType</code>.
*/
public void setFolderType(java.lang.String value) {
setValue(5, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderType</code>.
*/
@javax.persistence.Column(name = "FolderType", length = 4)
@javax.validation.constraints.Size(max = 4)
public java.lang.String getFolderType() {
return (java.lang.String) getValue(5);
}
/**
* Setter for <code>amanda.LogFolder.StatusCode</code>.
*/
public void setStatusCode(java.lang.Integer value) {
setValue(6, value);
}
/**
* Getter for <code>amanda.LogFolder.StatusCode</code>.
*/
@javax.persistence.Column(name = "StatusCode", precision = 10)
public java.lang.Integer getStatusCode() {
return (java.lang.Integer) getValue(6);
}
/**
* Setter for <code>amanda.LogFolder.PropertyRSN</code>.
*/
public void setPropertyRSN(java.lang.Integer value) {
setValue(7, value);
}
/**
* Getter for <code>amanda.LogFolder.PropertyRSN</code>.
*/
@javax.persistence.Column(name = "PropertyRSN", precision = 10)
public java.lang.Integer getPropertyRSN() {
return (java.lang.Integer) getValue(7);
}
/**
* Setter for <code>amanda.LogFolder.PropertyLocation</code>.
*/
public void setPropertyLocation(java.lang.String value) {
setValue(8, value);
}
/**
* Getter for <code>amanda.LogFolder.PropertyLocation</code>.
*/
@javax.persistence.Column(name = "PropertyLocation", length = 255)
@javax.validation.constraints.Size(max = 255)
public java.lang.String getPropertyLocation() {
return (java.lang.String) getValue(8);
}
/**
* Setter for <code>amanda.LogFolder.InDate</code>.
*/
public void setInDate(java.sql.Timestamp value) {
setValue(9, value);
}
/**
* Getter for <code>amanda.LogFolder.InDate</code>.
*/
@javax.persistence.Column(name = "InDate")
public java.sql.Timestamp getInDate() {
return (java.sql.Timestamp) getValue(9);
}
/**
* Setter for <code>amanda.LogFolder.IssueDate</code>.
*/
public void setIssueDate(java.sql.Timestamp value) {
setValue(10, value);
}
/**
* Getter for <code>amanda.LogFolder.IssueDate</code>.
*/
@javax.persistence.Column(name = "IssueDate")
public java.sql.Timestamp getIssueDate() {
return (java.sql.Timestamp) getValue(10);
}
/**
* Setter for <code>amanda.LogFolder.ExpiryDate</code>.
*/
public void setExpiryDate(java.sql.Timestamp value) {
setValue(11, value);
}
/**
* Getter for <code>amanda.LogFolder.ExpiryDate</code>.
*/
@javax.persistence.Column(name = "ExpiryDate")
public java.sql.Timestamp getExpiryDate() {
return (java.sql.Timestamp) getValue(11);
}
/**
* Setter for <code>amanda.LogFolder.ReferenceFile</code>.
*/
public void setReferenceFile(java.lang.String value) {
setValue(12, value);
}
/**
* Getter for <code>amanda.LogFolder.ReferenceFile</code>.
*/
@javax.persistence.Column(name = "ReferenceFile", length = 100)
@javax.validation.constraints.Size(max = 100)
public java.lang.String getReferenceFile() {
return (java.lang.String) getValue(12);
}
/**
* Setter for <code>amanda.LogFolder.IssueUser</code>.
*/
public void setIssueUser(java.lang.String value) {
setValue(13, value);
}
/**
* Getter for <code>amanda.LogFolder.IssueUser</code>.
*/
@javax.persistence.Column(name = "IssueUser", length = 128)
@javax.validation.constraints.Size(max = 128)
public java.lang.String getIssueUser() {
return (java.lang.String) getValue(13);
}
/**
* Setter for <code>amanda.LogFolder.FinalDate</code>.
*/
public void setFinalDate(java.sql.Timestamp value) {
setValue(14, value);
}
/**
* Getter for <code>amanda.LogFolder.FinalDate</code>.
*/
@javax.persistence.Column(name = "FinalDate")
public java.sql.Timestamp getFinalDate() {
return (java.sql.Timestamp) getValue(14);
}
/**
* Setter for <code>amanda.LogFolder.SubCode</code>.
*/
public void setSubCode(java.lang.Integer value) {
setValue(15, value);
}
/**
* Getter for <code>amanda.LogFolder.SubCode</code>.
*/
@javax.persistence.Column(name = "SubCode", precision = 10)
public java.lang.Integer getSubCode() {
return (java.lang.Integer) getValue(15);
}
/**
* Setter for <code>amanda.LogFolder.WorkCode</code>.
*/
public void setWorkCode(java.lang.Integer value) {
setValue(16, value);
}
/**
* Getter for <code>amanda.LogFolder.WorkCode</code>.
*/
@javax.persistence.Column(name = "WorkCode", precision = 10)
public java.lang.Integer getWorkCode() {
return (java.lang.Integer) getValue(16);
}
/**
* Setter for <code>amanda.LogFolder.FolderDescription</code>.
*/
public void setFolderDescription(java.lang.String value) {
setValue(17, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderDescription</code>.
*/
@javax.persistence.Column(name = "FolderDescription", length = 2147483647)
@javax.validation.constraints.Size(max = 2147483647)
public java.lang.String getFolderDescription() {
return (java.lang.String) getValue(17);
}
/**
* Setter for <code>amanda.LogFolder.FolderCondition</code>.
*/
public void setFolderCondition(java.lang.String value) {
setValue(18, value);
}
/**
* Getter for <code>amanda.LogFolder.FolderCondition</code>.
*/
@javax.persistence.Column(name = "FolderCondition", length = 2147483647)
@javax.validation.constraints.Size(max = 2147483647)
public java.lang.String getFolderCondition() {
return (java.lang.String) getValue(18);
}
/**
* Setter for <code>amanda.LogFolder.ParentRSN</code>.
*/
public void setParentRSN(java.lang.Integer value) {
setValue(19, value);
}
/**
* Getter for <code>amanda.LogFolder.ParentRSN</code>.
*/
@javax.persistence.Column(name = "ParentRSN", precision = 10)
public java.lang.Integer getParentRSN() {
return (java.lang.Integer) getValue(19);
}
/**
* Setter for <code>amanda.LogFolder.CopyFlag</code>.
*/
public void setCopyFlag(com.csdcsystems.schema.custom.CopyFlag value) {
setValue(20, value);
}
/**
* Getter for <code>amanda.LogFolder.CopyFlag</code>.
*/
@javax.persistence.Column(name = "CopyFlag", length = 7)
public com.csdcsystems.schema.custom.CopyFlag getCopyFlag() {
return (com.csdcsystems.schema.custom.CopyFlag) getValue(20);
}
/**
* Setter for <code>amanda.LogFolder.StampDate</code>.
*/
public void setStampDate(java.sql.Timestamp value) {
setValue(21, value);
}
/**
* Getter for <code>amanda.LogFolder.StampDate</code>.
*/
@javax.persistence.Column(name = "StampDate")
public java.sql.Timestamp getStampDate() {
return (java.sql.Timestamp) getValue(21);
}
Upvotes: 1
Views: 9220
Reputation: 7858
getDeclaredField
is a method part of the Java Reflection API, its purpose is to find a java field (aka instance attribute) that has been defined in the specific class you are querying for the field, as opposite to getField
which will try to find the specified field across the whole class hierarchy.
You would just use it just if your class TableRecord
would have been defined like this:
public class TableRecord {
public Date StampDate;
// other fields
}
However, as your code shows, you are looking for something else. Your class TableRecord
doesn't have a field named StampDate
, it rather has a property named stampDate
. There are two approaches here, one could be using Introspection and the other one using Reflection but fetching the method getStampDate
instead of the field.
Using Introspection you would do something like:
BeanInfo bi = Introspector.getBeanInfo(o1.getClass());
PropertyDescriptor[] properties = bi.getPropertyDescriptors();
// iterate over 'properties' and look for a property named 'stampDate'
// you then need to do the following
Date stampDate = (Date) stampDateProperty.getReadMethod().invoke(o1);
Using Reflection (maybe easier as you are already half way there):
Method method = o1.getClass().getDeclaredMethod("getStampDate");
Date value = (Date) method.invoke(o1);
For reference, take a look at the JavaBeans spec.
Upvotes: 3
Reputation: 10632
getClass().getDeclaredField
is used to get the value of a field
reflectively.The statement
Date d1 = (Date) o1.getClass().getDeclaredField("StampDate").get(o1);
will return the value for the field StampDate
. As it is throwing java.lang.NoSuchFieldException
it means this field is not present in the class or there is some spelling mistake. Try changing StampDate
to stampDate
.
getDeclaredField
gives all fields declared in the current class (not of any base classes) and getField
gives all public field up the entire class hierarchy. If the StampDate
is declared in any of the super classes, you can access that by using getField
.
Upvotes: 1