Web 使用反射获得一个对象的所有get方法
问题描述:
由于想知道request中包含哪些getter方法,就想通过反射进行遍历,然后输出,结果异常,异常信息:

问题代码:
try {
outGetter(request);
} catch (IntrospectionException e) {
e.printStackTrace();
}
public void outGetter(Object obj) throws IntrospectionException
{
Class<?> clazz = obj.getClass();
//获得所有的属性
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields)
{
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method method = pd.getReadMethod();
System.out.println(method);
}
}
问题分析:
IntrospectionException: 在 Introspection 期间发生异常时抛出异常。
典型的 cause 包括:无法将字符串类名称映射到 Class 对象、无法解析字符串方法名,或者指定对其用途而言具有错误类型签名的方法名称。
而Method not found:isRequest则表示isRequest方法找不到,分析遍历代码,可知:
public PropertyDescriptor(String propertyName, Class<?> beanClass) throws IntrospectionException
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
因此如果参数名为 "fred",则假定 writer 方法为 "setFred",reader 方法为 "getFred"(对于 boolean 属性则为 "isFred")。
注意,属性名应该以小写字母开头,而方法名称中的首写字母将是大写的。
参数:propertyName - 属性的编程名称。
beanClass - 目标 bean 的 Class 对象。例如 sun.beans.OurButton.class。
抛出:IntrospectionException - 如果在内省期间发生异常。 得到结论:通过反射输出对象的getter方法,前提是对象中的属性和getter一一对应
//通过实体类测试一下
public class User {
private String username;
private String pwd; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} } try { User user = new User();
outGetter(user); } catch (IntrospectionException e) { e.printStackTrace;
· }
结果输出:

问题解决:
原因找到了,那么回到最初的问题上来,如何获得对象的所有get方法?
public void outGetter(Object obj) throws IntrospectionException
{
Class<?> clazz = obj.getClass(); //返回此class对象所表示的类的所有public方法
Method[] methods = clazz.getMethods(); for(Method m:methods)
{
System.out.println(string);
} }
输出结果:

既然得到了所有的方法,那么能不能对这些方法进行筛选呢?
m.toString().contains("get"):判断方法中是否含有get,如果有,输出
m.toString().substring(m.toString().lastIndexOf(".")+1):将符合条件的方法名进行处理,只截取最后的方法名
public void outGetter(Object obj) throws IntrospectionException
{
Class<?> clazz = obj.getClass(); //返回此class对象所表示的类的所有public方法
Method[] methods = clazz.getMethods(); for(Method m:methods)
{
//需要进一步筛选
//截取最后的方法名 if(m.toString().contains("get"))
{
String string = m.toString().substring(m.toString().lastIndexOf(".")+1);
System.out.println(string);
} } }


问题总结:
PropertyDescriptor类:
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1. getReadMethod(),获得用于读取属性值的方法
2. getWriteMethod(),获得用于写入属性值的方法
通过反射输出对象的getter方法,前提是对象中的属性和getter一一对应
Web 使用反射获得一个对象的所有get方法的更多相关文章
- python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法
一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)
对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与not ...
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
- UWP 使用Windows.Web.Http命名空间下的HttpClient使用post方法,上传图片服务器
1.从相册里面选取图片 /// <summary> /// 1.1 从相册里面选取图片 /// </summary> /// <param name="send ...
- python web自动化测试框架搭建(功能&接口)——接口公共方法
接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...
- Day15_87_通过反射机制获取某个特定的方法
通过反射机制获取某个特定的方法 反射是通过 方法名+形参列表来区分各个方法的(形参列表要用class类型.加.class) 示例代码 import java.lang.reflect.Method; ...
随机推荐
- MySQL 5.7.18的安装与主从复制(转自:https://www.baidu.com/home/news/data/newspage?nid=9485770887287731252&n_typ)
CentOS6.7安装mysql5.7.18 1. 解压到/usr/local目录 # tar -zxvf mysql-5.7.18-linux-glibc2.5-i686.tar.gz -C /us ...
- 最小二乘法 及 梯度下降法 运行结果对比(Python版)
上周在实验室里师姐说了这么一个问题,对于线性回归问题,最小二乘法和梯度下降方法所求得的权重值是一致的,对此我颇有不同观点.如果说这两个解决问题的方法的等价性的确可以根据数学公式来证明,但是很明显的这个 ...
- CTF-练习平台-WEB之 签到题
一.签到题 根据提示直接加群在群公告里就能找到~
- MySQL Inception--原理和注意事项
========================================================= MySQL Inception原理图 ======================= ...
- hasura graphql-engine v1.0.0-alpha25 的几个方便功能
hasura graphql-engine 是一个很不错的graphql 引擎,但是我们的数据模型经常可能会有变动, 但是以前的版本对于这些的处理,官方的方式是删除元数据,重启server,都不是很好 ...
- nuclio dokcer 运行测试
nuclio serverless 平台,可以方便的进行实时事件以及数据处理应用的开发 dcoker 运行 启动 docker run -d -p 8070:8070 -v /var/run/dock ...
- vulcanjs 包类型
npm 添加在pacakge.json 文件中的 meteor core 包 由meteor 框架提供的 meteor remote 包 从包服务器加载的,使用username:package 格式组 ...
- pipelinedb Continuous transforms 操作
Continuous transforms 可以进行数据的转换,数据是不进行存储,主要是可以加入到其他的stream pipeline 中,或者写到其他外部 存储中,和存储过程结合使用,当前默认内置一 ...
- Google Android API官网封杀了,没法查android技术资料的3种解决方式
1.从uhdesk上訪问简化版android api在线文档(反应速度极快) http://www.uhdesk.com/simpleandroidoc/index.html 2.下载chm本地文 ...
- Git中特别的命令
Rebase 假设我们的分支结构如下: rebase 会把从 Merge Base 以来的所有提交,以补丁的形式一个一个重新达到目标分支上.这使得目标分支合并该分支的时候会直接 Fast Forwar ...