文章目录

  • 什么是反射?
  • 具体方法介绍
    • getFields方法
    • getDeclaredFields方法
    • getMethods方法
    • getDeclaredMethods方法
    • invoke方法

什么是反射?

生物学:反射是机体对内在或外在刺激有规律的反映。
java反射:官方解释是程序在运行状态中,对于任意一个类,都可以知道这个类所有属性和方法,对于任意一个对象都能够调用他的任意方法和属性。

具体方法介绍

首先定一个实体类

package com.leo.demo.reflecttest;/*** @ClassName: UserInfo* @Description: 反射的测试实例* @Author: leo825* @Date: 2020-03-03 09:19* @Version: 1.0*/
public class UserInfo {//用户idprivate String id;//用户姓名private String name;//用户性别private String gender;//用户年龄private String age;//测试属性1public String desc;//测试属性2protected String desc2;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"id='" + id + '\'' +", name='" + name + '\'' +", gender='" + gender + '\'' +", age='" + age + '\'' +'}';}public String toJsonString() {return "UserInfo{" +"\"id\":\"" + id + '\"' +", \"name\":\"" + name + '\"' +", \"gender\":\"" + gender + '\"' +", \"age\":\"" + age + '\"' +'}';}//这是个私有方法private void privateMethodTest(){System.out.println("我是是个私有方法");}
}

上面的实体类非常简单,那我们就测试一下通过反射获取属性和方法
测试定义一个UserInfo对象,并赋值相关属性

        UserInfo userInfo = new UserInfo();userInfo.setId("1");userInfo.setName("zhangsan");userInfo.setGender("男");userInfo.setAge("30");System.out.println(userInfo.toString());System.out.println(userInfo.toJsonString());//获取当前对象的ClassClass clz = userInfo.getClass();
getFields方法

getFields方法是获取当前对象所有的public属性

        System.out.println("获取当前对象的属性(public)");Field[] fields1 = clz.getFields();for (Field field : fields1) {System.out.println(field);}

测试结果

getFields获取当前对象的属性(public)
public java.lang.String com.leo.demo.reflecttest.UserInfo.desc
getDeclaredFields方法

getDeclaredFields获取当前对象的所有属性(public、protected、private)

        System.out.println("获取当前对象的属性(public、protected、private)");Field[] fields2 = clz.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}

测试结果

getDeclaredFields获取当前对象的属性(public、protected、private)
private java.lang.String com.leo.demo.reflecttest.UserInfo.id
private java.lang.String com.leo.demo.reflecttest.UserInfo.name
private java.lang.String com.leo.demo.reflecttest.UserInfo.gender
private java.lang.String com.leo.demo.reflecttest.UserInfo.age
public java.lang.String com.leo.demo.reflecttest.UserInfo.desc
protected java.lang.String com.leo.demo.reflecttest.UserInfo.desc2
getMethods方法

getMethods获取当前对象的所有公有方法(不包含私有方法,包含从父类继承的方法)
测试代码:

        System.out.println("getMethods获取当前对象的所有公有方法(不包含私有方法,包含从父类继承的方法)");Method[] methods = clz.getMethods();for (Method method1 : methods) {System.out.println(method1);}

测试结果

getMethods获取当前对象的所有公有方法(不包含私有方法,包含从父类继承的方法)
public java.lang.String com.leo.demo.reflecttest.UserInfo.toString()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getName()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getId()
public void com.leo.demo.reflecttest.UserInfo.setName(java.lang.String)
public void com.leo.demo.reflecttest.UserInfo.setGender(java.lang.String)
public void com.leo.demo.reflecttest.UserInfo.setAge(java.lang.String)
public java.lang.String com.leo.demo.reflecttest.UserInfo.toJsonString()
public void com.leo.demo.reflecttest.UserInfo.setId(java.lang.String)
public java.lang.String com.leo.demo.reflecttest.UserInfo.getGender()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getAge()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
getDeclaredMethods方法

getDeclaredMethods获取当前对象的所有方法(包含私有方法,不包含父类的方法)

        System.out.println("getDeclaredMethods获取当前对象的所有方法(包含私有方法,不包含父类的方法)");Method[] methods2 = clz.getDeclaredMethods();for (Method method2 : methods2) {System.out.println(method2);}

测试结果

getDeclaredMethods获取当前对象的所有方法(包含私有方法,不包含父类的方法)
public java.lang.String com.leo.demo.reflecttest.UserInfo.toString()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getName()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getId()
public void com.leo.demo.reflecttest.UserInfo.setName(java.lang.String)
private void com.leo.demo.reflecttest.UserInfo.privateMethodTest()
public void com.leo.demo.reflecttest.UserInfo.setGender(java.lang.String)
public void com.leo.demo.reflecttest.UserInfo.setAge(java.lang.String)
public java.lang.String com.leo.demo.reflecttest.UserInfo.toJsonString()
public void com.leo.demo.reflecttest.UserInfo.setId(java.lang.String)
public java.lang.String com.leo.demo.reflecttest.UserInfo.getGender()
public java.lang.String com.leo.demo.reflecttest.UserInfo.getAge()
invoke方法

通过反射方式执行对象里面的方法:

        System.out.println("invoke通过反射来执行方法(重要)");Method invokMethod = clz.getDeclaredMethod("privateMethodTest", null);//私有方法执行需要setAccessible=trueinvokMethod.setAccessible(true);invokMethod.invoke(userInfo, null);

执行私有方法需加要setAccessible=true,如果不加的话会报如下错:

Exception in thread "main" java.lang.IllegalAccessException: Class com.leo.demo.reflecttest.ReflectTest can not access a member of class com.leo.demo.reflecttest.UserInfo with modifiers "private"at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)at java.lang.reflect.Method.invoke(Method.java:490)at com.leo.demo.reflecttest.ReflectTest.main(ReflectTest.java:61)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

测试结果

invoke通过反射来执行方法(重要)
我是是个私有方法

什么是反射?反射的用法?实例说明。相关推荐

  1. php 反射对象属性,php面向对象之反射功能的用法详解

    这篇文章主要介绍了php面向对象之反射功能与用法,结合实例形式简单分析了php5面向对象反射的概念及具体用法,需要的朋友可以参考下 本文实例讲述了php面向对象之反射功能与用法.分享给大家供大家参考, ...

  2. java reflections_java反射工具Reflections用法

    java反射工具Reflections用法 一.引入maven依赖 org.reflections reflections 0.9.10 二.用法示例: reflections 中包含很多的Scann ...

  3. java reflections_关于java:java反射工具Reflections用法

    java反射工具Reflections用法 一.引入maven依赖 org.reflections reflections 0.9.10 二.用法示例: reflections 中蕴含很多的Scann ...

  4. Proxy代理 和 Reflect反射(反射的是obj)的概念

    1. Proxy代理 // 供应商(原始对象)let obj = {time:'2018-01-03',name:'net',_r: "123"}// 创建代理商,传入obj数据l ...

  5. Unity C#基础之 反射反射,程序员的快乐

    反射反射,程序员的快乐 这句话想必大家都经常听过,基本上在绝大多数的框架和一些设计模式中都能看到反射的身影(MVC.IOC.AOP.O/RM), 反射:是.Net Framework提供的一个帮助类库 ...

  6. 黑马程序员-反射-constructor-feld类-Method-数组的反射-反射的作用

    ---------------------- android培训.java培训.期待与您交流! ---------------------- 反射的基石→Class类 Java程序中的各个Java类属 ...

  7. Java反射——反射机制问题——第一章

    Java反射--反射机制问题--第一章 Java反射--Class类--第二章 Java反射--类加载--第三章 Java反射--反射获取类的结构信息--第四章 文章目录 1:一个需求引出反射 2:反 ...

  8. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  9. php中 datalist,html5 datalist标签的用法是什么?这里有datalist标签的用法实例

    本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例.本文说了两个常用的选项框的实例供大家选择观看,下面就让我们一起来看这篇文章吧 我们先来看 ...

  10. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

最新文章

  1. Python包管理工具pip安装
  2. protobuf + maven 爬坑记
  3. 每日一皮:当代互联网企业真实写照!
  4. android 游戏引擎 排行_4月旗舰手机性能排行榜:小米10 Pro第四,OPPO Ace2第五
  5. 如何让cloudflare缓存html,wordpress博客使用CloudFlare的页面规则缓存设置教程
  6. Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法
  7. Ubuntu 磁盘自动挂载解决
  8. pytorch加载自己的图像数据集
  9. firefly 3399 开发板笔记
  10. EXCEL 编辑公式时如何固定某一个单元格
  11. vue 调起浏览器打印
  12. 解决导出Excel表格,浏览器不下载
  13. 基于PyQt的分组工具
  14. jmp 指令的几种寻址方式
  15. 阿里出品,Excel 操作利器:easy-excel
  16. 2022课堂云 艺术的启示 章节习题
  17. 分享几个对话配音使用的软件给你
  18. TorchProtein教程--预训练的蛋白质结构表示(5)
  19. 大佬带你看DevOps
  20. html360度汽车展示,汽车360度展示-兰博基尼

热门文章

  1. SAP生产订单状态详解
  2. 黄峥为何放手拼多多?数据揭秘电商平台布局背后逻辑
  3. 中国34城最全剖析:深圳、天津的短板与不足,何时才能补?
  4. 元宇宙这把火开始烧向打工人
  5. linux下使用idl生成h文件,LINIUX下IDL的安装
  6. linux samba默认端口,Linux 指定端口挂载samba 亲测可用!
  7. vc6怎么看错误在哪_网红莉哥怎么红的为什么被封了 网红莉哥1400事件视频在哪看...
  8. java isodate格式_fmt:formatDate的输出格式详解
  9. 扩展虚拟机Ubuntu磁盘容量空间
  10. java生成验证码工具类_Java生成图形验证码工具类