问题描述:

由于想知道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方法的更多相关文章

  1. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  2. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

  3. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  4. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)

    对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...

  5. 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口   同步的实现方面有两种,分别是synchronized,wait与not ...

  6. java 通过反射机制调用某个类的方法

    package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect {     public s ...

  7. UWP 使用Windows.Web.Http命名空间下的HttpClient使用post方法,上传图片服务器

    1.从相册里面选取图片 /// <summary> /// 1.1 从相册里面选取图片 /// </summary> /// <param name="send ...

  8. python web自动化测试框架搭建(功能&接口)——接口公共方法

    接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...

  9. Day15_87_通过反射机制获取某个特定的方法

    通过反射机制获取某个特定的方法 反射是通过 方法名+形参列表来区分各个方法的(形参列表要用class类型.加.class) 示例代码 import java.lang.reflect.Method; ...

随机推荐

  1. react和vue——比较

    相同点: 1.JavaScript的UI框架.专注于创造前端的富应用. 2.都有虚拟DOM,DOM树的虚拟表现------改变真实的DOM状态比改变一个JavaScript对象的花销要大得多. Vir ...

  2. 【Genymotion】add a new virtual device 失败

    Genymotion 新增虚拟设备(模拟器)时,由于网络原因,总是下载失败,如图: 下载失败提示“Unable to create virtual device: Connection timeout ...

  3. LSTM神经网络

    LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...

  4. 第七届蓝桥杯个人赛省赛--C语言B组

    题目一 煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球? 请 ...

  5. TJU Problem 1015 Gridland

    最重要的是找规律. 下面是引用 http://blog.sina.com.cn/s/blog_4dc813b20100snyv.html 的讲解: 做这题时,千万不要被那个图给吓着了,其实这题就是道简 ...

  6. 洛谷 1020:导弹拦截(DP,LIS)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  7. HDU 4681 string 求最长公共子序列的简单DP+暴力枚举

    先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...

  8. Git冲突和解决冲突

    1.产生冲突原因 产生:多个开发者同时使用或者操作git中的同一个文件,最后在依次提交和push的时候,第一个操作的是可以正常提交的,而之后的开发者想要执行pull(拉)和pull(push)操作的时 ...

  9. How Distributed Outer Joins on PostgreSQL with Citus Work

    转自: https://docs.citusdata.com/en/v7.5/articles/outer_joins.html SQL is a very powerful language for ...

  10. 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...