我有一个下面的类,我需要使用java反射从getter方法获取字段名称。 是否可以使用getter方法获取字段名称或属性名称?
class A {
private String name;
private String salary;
// getter and setter methods
}
我的问题是:我可以通过getter方法获取字段/属性名称吗?如果我使用getName(),我可以得到name属性吗?我需要name属性,但不需要它的值。是否可以通过java反射?
答案 0 :(得分:16)
是的,这是100%可能..
public static String getFieldName(Method method)
{
try
{
Class<?> clazz=method.getDeclaringClass();
BeanInfo info = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] props = info.getPropertyDescriptors();
for (PropertyDescriptor pd : props)
{
if(method.equals(pd.getWriteMethod()) || method.equals(pd.getReadMethod()))
{
System.out.println(pd.getDisplayName());
return pd.getName();
}
}
}
catch (IntrospectionException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
答案 1 :(得分:7)
仅仅删除&#34; get&#34;并不完全合适。或&#34;是&#34;前缀和小写的第一个字母。例如,getID的相应bean名称将是ID而不是iD。
获取bean名称的最简单方法是删除get或is前缀,然后将结果传递给Introspector.decapitalize。
这是我写的一个方法来做这件事:
private String getBeanName(String methodName)
{
// Assume the method starts with either get or is.
return Introspector.decapitalize(methodName.substring(methodName.startsWith("is") ? 2 : 3));
}
答案 2 :(得分:5)
您无法使用反射检查代码的作用。
您可以假设getName()
方法读取名为name
的字段,而不执行任何其他操作。但是没有必要这样做。例如字段名称可能是m_name
或_name
或nameField
,也可能不是字段。
答案 3 :(得分:4)
reflection-util库提供了一种以类型安全的方式确定属性(名称)的方法。 例如,通过使用getter方法:
String propertyName = PropertyUtils.getPropertyName(A.class, A::getSalary);
在这种情况下,propertyName
的值为"salary"
。
免责声明:我是reflection-util库的作者之一。
答案 4 :(得分:1)
如果您的bean遵循JavaBean约定,那么您使用反射来获取所有“get”和“is”方法,并从检索到的方法名称中删除“get”或“is”前缀,并且您具有字段名称。
更新
// Get the Class object associated with this class.
MyClass myClass= new MyClass ();
Class objClass= myClass.getClass();
// Get the public methods associated with this class.
Method[] methods = objClass.getMethods();
for (Method method:methods)
{
String name=method.getName();
if(name.startsWith("get") || name.startsWith("is"))
{
//...code to remove the prefixes
}
}
答案 5 :(得分:0)
您应该通过该方法访问。目前,getter会返回成员name
,,但这可能会在将来发生变化。它可以从数据库或Web服务中懒惰地实例化它,从firstname / surname等构建它。name
字段很可能不存在。
所以总是通过方法(甚至通过反射)
答案 6 :(得分:0)
你可以
Field[] declaredFields = A.class.getDeclaredFields();
for(Field f:declaredFields){
System.out.println(f.getName());
}
答案 7 :(得分:0)
如果你知道方法的名称,你只需要删除“get”并将下面的字母转换为低位字母,这样就不需要反射了。
如果getter方法(getName())返回名称不同于“name”的属性,则无法从方法名称中获取属性的名称。
如果你不知道方法的名称,通过反射你可以获得所有方法,你也可以获得所有名称的属性。
答案 8 :(得分:0)
使用反射API,可以检索POJO字段,如下所示。继承的类可能会在这里找到问题。
TestClass testObject= new TestClass().getClass();
Fields[] fields = testObject.getFields();
for (Field field:fields)
{
String name=field.getName();
System.out.println(name);
}
或者通过使用Reflections API,人们还可以检索类中的所有方法并迭代它以查找属性名称(标准POJO方法以get / is / set开头)...这种方法适用于我的继承类结构
TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
String name=method.getName();
if(name.startsWith("get"))
{
System.out.println(name.substring(3));
}else if(name.startsWith("is"))
{
System.out.println(name.substring(2));
}
}
然而,下面有一个更有趣的方法:
在Jackson库的帮助下,我能够找到String / integer / double类型的所有类属性,以及Map类中的相应值。 (所有不使用反射api!)
TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();
Map<String,Object> props = m.convertValue(testObject, Map.class);
for(Map.Entry<String, Object> entry : props.entrySet()){
if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}
答案 9 :(得分:0)
您可以使用 lombok's @FieldNameConstants
注释。
注释您的课程:
import lombok.experimental.FieldNameConstants;
import lombok.AccessLevel;
@FieldNameConstants
public class FieldNameConstantsExample {
private final String name;
private final int rank;
}
在后台生成以下代码:
public class FieldNameConstantsExample {
private final String name;
private final int rank;
public static final class Fields {
public static final String name = "name";
public static final String rank = "rank";
}
}
因此您可以通过以下方式访问属性名称:
FieldNameConstantsExample.Fields.name
这是字符串 "name"
答案 10 :(得分:-1)
尝试以下
class A{
private String name;
private String salary;
//getter and setter methods
public void setName(String name){
this.name = name;
}
public void setSalary(String salary){
this.salary = salary;
}
public String getName(){
return name;
}
public String getSalary(){
return salary;
}
}
get 方法用于从程序方法或数据库中动态检索数据。它只反映值而不是值的属性。