【转】 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法,这就是内省机制。
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1. getReadMethod(),获得用于读取属性值的方法
2. getWriteMethod(),获得用于写入属性值的方法
public static void main(String[] args) throws Exception { Users users=new Users(); users.setId("1"); users.setUsername("aaaa"); users.setPassword("123"); //in是对一个Bean的描述,可以通过它取得Bean内部的信息 BeanInfo in=Introspector.getBeanInfo(Users.class); //获得所有属性描述 PropertyDescriptor[] p=in.getPropertyDescriptors(); for (PropertyDescriptor pd: p) { Method method=pd.getReadMethod(); method.getName(); Object result = method.invoke(users) ; System.out.println(method.getName()+">>>>>"+result); System.out.println(p); System.out.println("----------------"); } } }
结果:
getClass>>>>>class cn.itcast.domian.Users [Ljava.beans.PropertyDescriptor;@1430b5c ---------------- getId>>>>>1 [Ljava.beans.PropertyDescriptor;@1430b5c ---------------- getPassword>>>>>123 [Ljava.beans.PropertyDescriptor;@1430b5c ---------------- getUsername>>>>>aaaa [Ljava.beans.PropertyDescriptor;@1430b5c ----------------
public static void main(String[] args) throws Exception { Users users=new Users(); users.setId("1"); users.setUsername("aaaa"); users.setPassword("123"); PropertyDescriptor p2=new PropertyDescriptor("username", Users.class);//获得name属性的属性描述器 //得到name属性的getter方法 Method readMethod=p2.getReadMethod(); //执行getter方法,获取返回值,即name属性的值 String result = (String) readMethod.invoke(users,args); System.out.println(result); //得到name属性的setter方法 Method writeMethod =p2.getWriteMethod() ; //执行setter方法,修改name属性的值 writeMethod.invoke(users, "bbbb"); System.out.println(users.getUsername()); }
结果:
aaaa bbbb
如对本文有疑问, 点击进行留言回复!!
解决idea中出现“illegal character U+200B” 问题
荐 为什么加了@Transactional注解,事务没有回滚?
Attribute ‘sklearn.linear_model._logistic.LogisticRegression.multi_class‘ must be explicitly set to
Java/Python实现 LeetCode剑指Offer 14-I.剪绳子(动态规划)
网友评论