getclass().getfield
时间: 2023-06-22 12:45:30 浏览: 50
`getClass().getField()` 是 Java 语言中的反射 API。它用于获取对象的类信息以及对象中的字段信息。具体来说,`getClass()` 方法返回对象的类信息,然后 `getField()` 方法获取该类中指定名称的公共字段。例如,以下代码可以获取对象 obj 中名为 fieldName 的公共字段:
```
Class<?> clazz = obj.getClass();
Field field = clazz.getField(fieldName);
```
需要注意的是,如果字段不是公共的,即使用 `private` 修饰符声明的,就需要使用 `getDeclaredField()` 方法来获取。此外,如果字段是静态的,则可以使用 `getDeclaredField()` 或 `getField()` 方法来获取。
相关问题
Field[] fields = ReflectUtil.getFields(eventData.getClass()); for (Field field : fields) { if (Objects.isNull(field.getAnnotation(TranslateFileds.class))) { continue; } TranslateFiled[] actions = field.getAnnotationsByType(TranslateFiled.class); for (TranslateFiled action : actions) { Field translateFiledDesc = ReflectUtil.getField(eventData.getClass(), field.getName() + "Desc"); if (!translateFiledDesc.isAccessible()) { translateFiledDesc.setAccessible(true); } if (action.key().equals(field.get(eventData))) { translateFiledDesc.set(eventData, action.value()); } } },优化下这段代码的执行速度,并给出速度更快的代码
这段代码的作用是在遍历一个类的所有字段,如果字段上有注解@TranslateFileds,那么再遍历这个字段上的所有@TranslateFiled注解,检查这个注解的key是否等于该字段的值,如果相等,就把该字段对应的"Desc"字段赋值为该注解的value。
可以通过下面几种方法优化代码的执行速度:
1. 优化遍历字段的代码,避免多次调用ReflectUtil.getFields()方法,或者在字段多的时候使用并行Stream进行遍历。
2. 使用缓存,预先缓存所有有@TranslateFileds注解的字段和它们对应的"Desc"字段,避免每次遍历都通过ReflectUtil.getField()方法获取。
3. 将代码改为使用Map,存储所有的@TranslateFiled注解,每次只需要通过Map获取对应的value,而不需要遍历所有注解。
4. 使用switch语句代替for循环,可以大幅提高代码执行速度。
例如:
```
Map<String, String> translateMap = new HashMap<>();
TranslateFiled[] actions = field.getAnnotationsByType(TranslateFiled.class);
for (TranslateFiled action : actions) {
translateMap.put(action.key(), action.value());
}
Field translateFiledDesc = ReflectUtil.getField(eventData.getClass(), field.getName() + "Desc");
if (!translateFiledDesc.isAccessible()) {
translateFiledDesc.setAccessible(true);
}
String key = (String) field.get(eventData);
if (translateMap.containsKey(key)) {
translateFiledDesc
List<SchemaRowFilterCondition> schemaRowFilterConditions = JSONObject.parseArray(filterConditionList, SchemaRowFilterCondition.class); for (SchemaRowFilterCondition schemaRowFilterCondition : schemaRowFilterConditions) { String field = schemaRowFilterCondition.getField(); String camel = underlineToCamel(field); String key = schemaRowFilterCondition.getKey(); Field fieldsAndParentsField = fieldStream .filter(f -> StringUtils.equals(f.getName(), camel)) .findFirst() .orElseThrow(() -> new CustomException("大马猴来了", code)); Field f = object.getClass().getDeclaredField(camel); f.setAccessible(true); Object value = f.get(object); if (StringUtils.equals(key, value.toString()) && schemaRowRuleEo.getRowEditPermission()) { System.out.println("修改成功"); } else { throw new CustomException("大马猴来了", code); } }帮我优化代码
以下是对代码的优化建议:
1. 将对象的所有字段名转换为驼峰命名法,可以在对象初始化时进行,避免在循环中反复转换。
2. 将字段名与过滤条件的匹配逻辑抽离成一个方法,减少重复代码。
3. 将异常信息的文本提取成常量或配置文件中的字符串,避免在代码中硬编码。
4. 将对对象属性的访问和设置逻辑封装成一个工具方法,提高代码的重用性。
下面是优化后的代码示例:
```
// 将对象的所有字段名转换为驼峰命名法
Map<String, Field> fieldMap = Arrays.stream(object.getClass().getDeclaredFields())
.collect(Collectors.toMap(f -> underlineToCamel(f.getName()), Function.identity()));
for (SchemaRowFilterCondition schemaRowFilterCondition : schemaRowFilterConditions) {
String field = schemaRowFilterCondition.getField();
String camel = underlineToCamel(field);
Field fieldInfo = fieldMap.get(camel);
// 检查字段是否存在
if (fieldInfo == null) {
throw new CustomException(FIELD_NOT_FOUND_MSG, code);
}
// 检查字段值是否匹配
if (!matchFieldValue(schemaRowFilterCondition.getKey(), fieldInfo, object)) {
throw new CustomException(FIELD_VALUE_NOT_MATCH_MSG, code);
}
}
// 工具方法:获取对象属性值
private static Object getFieldValue(Field field, Object obj) throws IllegalAccessException {
field.setAccessible(true);
return field.get(obj);
}
// 工具方法:设置对象属性值
private static void setFieldValue(Field field, Object obj, Object value) throws IllegalAccessException {
field.setAccessible(true);
field.set(obj, value);
}
// 工具方法:检查字段值是否匹配
private static boolean matchFieldValue(String valueStr, Field field, Object obj) throws IllegalAccessException {
Object value = getFieldValue(field, obj);
return StringUtils.equals(valueStr, value.toString()) && schemaRowRuleEo.getRowEditPermission();
}
```
注意:上述优化示例仅供参考,具体优化方案需要根据实际情况进行调整。