Gần đây tôi đã thay đổi lược đồ của mình một chút để lớp của tôi kế thừa từ một lớp siêu, vấn đề là phương pháp so sánh của tôi tạo nhật ký kiểm tra, sử dụng phản chiếu Java, hiện chỉ lặp qua các trường của con lớp học, không phải là siêu lớp, có cách nào để có được tất cả các FIELDS không? hoặc tôi có cần bỏ nó vào lớp siêu đẳng .....?Làm thế nào để Java phản ánh các trường tại chỗ trong lớp siêu? không chỉ là lớp thực tế
Heres phương pháp của tôi dưới đây:
public static <T> String GenerateChangeLogForEntity(T old, T updated) {
String text = "";
try {
Field[] fields = old.getClass().getDeclaredFields();
if(fields != null) {
BaseController.getLogger().info("Z1 num fields:"+fields.length);
for (Field field : fields) {
if(field.isAnnotationPresent(Column.class)) {
String fieldName = field.getName();
BaseController.getLogger().info(field.getName());
if(field.isAnnotationPresent(Variation.class)) {
Variation v = field.getAnnotation(Variation.class);
fieldName = v.friendlyName();
}
field.setAccessible(true);
if(field.get(old) != null && field.get(updated) != null) {
if(!(field.get(old)).equals(field.get(updated))) {
text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(old))+"</strong> to: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "</strong></p>";
}
}
if(field.get(old) == null && field.get(updated) != null) {
text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>empty</strong> to: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "</strong></p>";
}
if(field.get(old) != null && field.get(updated) == null) {
text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated))+"</strong> to <strong>empty</strong>" + "</p>";
}
field.setAccessible(false);
}
}
}
} catch(IllegalAccessException e) {}
return text;
}
NB: Có lẽ bạn không nên đặt 'field.setAccessible (false)' để ngăn điều kiện cuộc đua trong môi trường nhiều luồng ... –
phương tiện của bạn là: 'instance.getClass(). GetSuperCLass(). GetDeclaredFields() '? – MJM
Cảm ơn MJM, cảm ơn tất cả mọi người, yip đã làm nó dễ dàng như chiếc bánh! :) – Baconbeastnz