专栏首页学习分享-实践为王Class 类中获取的三种⽅式
原创

Class 类中获取的三种⽅式

获取类的三种⽅式:

1. Class.forName("全类名") //常⽤于配置使⽤
2. 类型.class
3. 对象.getClass()  

//延伸
//获取全类名
1. class对象.getName();
//获取简单类名
2. class对象.getSimpleName();
//获取⽗类
3. class对象.getSuperclass();

  • Modifier 修饰
class对象.getModifiers();
//⽤于获取类的修饰,返回int类型 
//⽐如如果是默认修饰,则返回0 ,public返回1 对应的返回值对应修饰请参考jdk⽂档
  • Field 属性

下⾯操作返回的是⼀个Field属性对象

//获取对象的public修饰的属性
1. class对象.getField("属性名")
//获取public修饰的所有的属性
2. class对象.getFields()
//根据属性名获取对象属性(包含私有)
3. class对象.getField("属性名")
//获取对象所属性
4class对象.getDeclaredFields();

  操作属性对象

//获取对象的属性值,此处的obj你需要取值的类属性值的对象
1. filed对象.get(obj)
//对象属性赋值,此处的obj你需要取值的类属性值的对象,value是你需要设置的值
2. filed对象.set(obj,value)
  • Method ⽅法
  • 下⾯操作返回的是是⼀个Method对象

//获取对象的public修饰的⽅法
1. class对象.getMethod("⽅法名",Object类型的可变参...)
//获取public修饰的所有的⽅法
2. class对象.getMethods()
//根据属性名获取对象⽅法(包含私有)
3. class对象.getMethod("⽅法名",Object类型的可变参...)
//获取对象所⽅法
4. class对象.getDeclaredMethods();

--操作⽅法对象

//执⾏⽅法,此处的obj你需要执⾏的⽅法的对象,可变参是你调⽤这个⽅法需要传的参数
1.method对象.invoke(obj,可变参...)
  • Construtor 构造
//获取构造
1. class对象.getConstructor(Class类型的可变参...)
//获取所有构造
2. class对象.getConstructors()
//同上两个⼀样,有Declared相应的⽅法

       由上可知,我们⼀般在反射操作上,⼀般都会使⽤带有Declared的⽅法,因为可获取全部的包括私有的⼀些属性、⽅法,使⽤不带Declared的⽅法则可获取包含⽗类的⼀些公有属性、⽅法,Declared只能获取⾃⼰的,若此属性、⽅法是有私有权限控制的,此时我们直接操作属性、⽅法会抛出⼀个java.lang.IllegalAccessException异常,告诉你没有访问权限。获取Declared的⽅法、属性后,若此⽅法、属性是私有的需要设置访问权限setAccessible(true),⼜称暴⼒破解,这样我们就能顺利操作⽅法、属性等数据了。

反射延伸——内省

内省(Introspector) 是Java 语⾔对 JavaBean 类属性、事件的⼀种缺省处理⽅法 ⾥边运⽤了反射的⼀些基本原理将JavaBean封装成⼀个BeanInfo对象,⽅便我们进⾏操作.

下⾯的⼀个例⼦是对象转map

/**
  * 对象转Map
  *
  * @param s 对象
  * @param <S> 类型
  */
public static <S> Map<String, Object> objectToMap(S s) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
    Map<String, Object> map = new HashMap<>();
    //使⽤内省获取对象的基本信息
    BeanInfo beanInfo =
    Introspector.getBeanInfo(BeanUtils.getRealClass(s.getClass()));
    //获取对象的属性描述进⾏遍历处理
    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
    for (PropertyDescriptor pd : pds) {
        //获取属性名
       if ("class".equals(pd.getName())) {
           continue;
       }
       //获取set⽅法并执⾏
       Object invoke = pd.getReadMethod().invoke(s);
       map.put(pd.getDisplayName(), invoke == null ? "" :((Date.class.equals(invoke.getClass()) ||java.sql.Date.class.equals(invoke.getClass())) ? DateUtils.toString((Date)invoke) : invoke));
    }
    return map;
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试:说说Java反射中获取Class对象三种方式的区别?

    在上篇文章《一篇文章全面了解Java反射机制》中我们学习了Java反射机制的基本使用,留心的朋友可能已经注意到了,在文中提到了三种获取Class对象的方法。

    程序新视界
  • Metadata获取的三种方式

    这些信息都可以通过kubectl命令获取,但是有的情况下,我们需要从应用内获取,例如获取当前Pod的地址、主机名等一些信息,这就要求我们必须知道如何在应用内获取...

    大江小浪
  • HashMap的三种获取方式

    await
  • python学习笔记:第19天 类的约束

    真正写写项目的代码时都是多人协作的,所以有些地方需要约束程序的结构。也就是说,在分配任务之前就应该把功能定义好,然后分别交给底下的程序员来完成相应的功能。

    py3study
  • 【我在拉勾训练营学技术】绝对值得你收藏的 spring 笔记

    spring的核心容器 就是最下面的core,context,Bean 。为上层架构提供服务。

    程序员爱酸奶
  • 第十九天- 约束 异常处理 日志使用

    py3study
  • 简单详细的SpringBoot自动配置原理解析

    上一篇文章我们介绍了SpringFactoriesLoader,之所以介绍SpringFactoriesLoader是因为我们这篇文章要介绍的SpringBoo...

    码农飞哥
  • 肝了一夜的66道并发多线程面试题,你不来个666吗?

    线程是操作系统能够进⾏运算调度的最⼩单位,它被包含在进程之中,是进程中的实际运作单位,可以使⽤多线程对进⾏运算提速。

    狼王编程
  • python学习笔记:第16天 面向对象

    ⾸先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到⽬前为⽌. 我们 已经学过了⼀些成员了.

    py3study
  • 面向对象:封装,多态

    1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如....

    changxin7
  • 【我在拉勾训练营学技术】OAuth2+JWT 实现权限验证

    1、基于 Session 的认证⽅式在分布式的环境下,基于 session 的认证会出现⼀个问题,每个应⽤服务都需要在session中存储⽤户身份信息,通过负载...

    程序员爱酸奶
  • day16 类

    1.   面向过程:  一切以事物的流程为核心.  核心是"过程"二字, 过程是指解决问题的步骤, 即, 先干什么, 后⼲什么. 基于该思想编写程序就好比在编写...

    py3study
  • 面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!

    对于普通的应届生或者工作时间不长的初级开发 ???—— crud仔流下了没有技术的眼泪。

    三分恶
  • SpringBoot静态获取 bean的三种方式

    实现方式:在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象

    Vincent-yuan
  • Java程序员学习Go指南(二)

    摘抄:https://www.luozhiyun.com/archives/211

    luozhiyun
  • spring boot 源码解析-SpringApplication初始化

    就是这么简单的代码,构成了spring boot的世界. 那么代码中只有⼀个@SpringBootApplication 注解 和 调⽤了SpringAppli...

    吴生
  • Redis与Python进行交互

    安装Redis的有3种方式https://github.com/andymccurdy/redis-py

    skylark
  • 彻底读懂 springMVC 请求处理流程

    springmvc 在web 项目中基本上是必用的,基于servlet的一种控制层框架,我们在使用的过程中往往会碰到各种问题,有时候还没有思绪解决问题,主要是因...

    程序员爱酸奶
  • 红蓝对抗之邮件钓鱼攻击

    下图为calc.exe的快捷⽅式的属性信息,我们可以在“⽬标”栏写⼊⾃⼰的恶意命令,如powershell上线命令:

    腾讯安全应急响应中心

扫码关注云+社区

领取腾讯云代金券