玩玩JAVA反射

什么是反射

  • Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任何一个方法和属性;这样动态获取新的以及动态调用对象的方法的功能就叫做反射。
  • 简单来说反射就是解剖一个类,然后获取这个类中的属性和方法,前提是要获取这个类的Class对象。
  • 在java中,给我们提供几个类用于描述编译后的对象

描述

java.lang.Class

描述编译后的class文件的对象

java.lang.reflect.Constructor

用于描述构造方法

java.lang.reflect.Field

描述字段(成员变量)

java.lang.reflect.Method

描述成员方法

如何使用反射

1、使用Class类,获取出被解剖的这个类的class文件对象

2、使用Class类方法,获取出类中的所有成员

3、将成员获取出来后,交给对应类,对应类中的方法,运行成员

如何获取class文件对象

  • 使用类的对象获取

调用Object类的getClass() 方法,obj.getClass()

  • 使用类的静态属性获取

ClassName.class

  • 使用Class类的静态方法获取

Class.forName("类名");

不管用哪种方式获取的Class对象,他们都是相等的。

获取类对象

  • 获取Field
Class cls = xxx.class;
Field[] fields1 = cls.getFields();//获取Class对象里面所有public的成员变量
Field[] fields2 = cls.getDeclaredFields();//获取Class对象中所有的成员变量
Field field1 = cls.getField("a");//获取Class对象中名字为 a 的成员变量
Field field2 = cls.getDeclaredField("b");//获取Class对象中名字为 b 的成员变量
  • 获取Method
Class cls = xxx.class;
Method[] methods = cls.getMethods(); //获取Class对象里面所有public的方法
Method[] declaredMethods = cls.getDeclaredMethods(); //获取Class对象里面所有public的方法
Method[] method1 = cls.getMethod("method"); //获取Class对象里面所有public的方法
Method declaredMethod1 = cls.getDeclaredMethod(""); //获取Class对象里面所有public的方法
  • 获取构造函数
Constructor[] constructors = cls.getConstructors(); //获取所有public构造函数
Constructor[] declaredConstructors = cls.getDeclaredConstructors(); //获取所有构造函数,包括private构造函数
Constructor constructor = cls.getConstructor(String.class); //获取指定参数public构造函数
Constructor declaredConstructor = cls.getDeclaredConstructor(Integer.class); //获取指定参数的构造函数,也可以private

修改Field

对于private的属性,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

Field field = xxx;
//private field 需要设置 accessible
//field.setAccessible(true);
//obj是对象,value是要设置的值
field.set(obj,value);

调用方法

对于private的方法,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

Method method = xxx;
//private 方法需要设置 accessible
//method.setAccessible(true);
//obj为对象,param1,param2 为参数,当方法无参时,直接调用 method.invoke(obj); 即可
method.invoke(obj,param1,param2...)

玩转java反射的更多相关文章

  1. java反射原来是这么玩的(反射一开,谁都不爱)

    反射的发展历史 1996年01月23日,jdk 1.0版本发布,代号为Oak(橡树). 这个代号为Oak(橡树)的版本,在发布后的第二年,1997年02月19日,发布jdk 1.1版本,这次版本发布中 ...

  2. Java反射探索研究(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...

  3. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  4. 8千字干货教程|java反射精讲

    java反射机制精讲 目录 1. 反射机制的概念 2. 反射的基础Class类 3. 反射的用法 4. 反射的应用示例 作者简介:全栈学习笔记,一个正在努力的人 微信公众号:公众号日更,精彩美文每天推 ...

  5. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  6. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  7. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  8. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  9. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

随机推荐

  1. HTML中使用CSS样式(上)

    在每一个标签上都可以设置style属性,这就是CSS样式: <div style="height:48px;border: 1px solid red;text-align:cente ...

  2. 前端存储 (5) - service worker 离线存储

    service worker 离线存储 简介: 一般的网站 在我们无法访问的 时候 一般 回出现 如下 该网页无法访问 service worker 构建的网站不会出现这个错误,因为所有的 请求都是先 ...

  3. 面试中的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的内容.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  4. Flutter 粘合剂CustomScrollView控件

    老孟导读:快乐的51假期结束了,切换为努力模式,今天给大家分享CustomScrollView组件,此组件在以后的项目中会经常用到,CustomScrollView就像一个粘合剂,将多个组件粘合在一起 ...

  5. G - Pictures with Kittens (easy version) dp

    https://codeforces.com/problemset/problem/1077/F1 这个其实是一个比较简单的dp了 题目大意: 给你n个数,让你从n个数里选出x个数,并且每隔k个至少选 ...

  6. 【Linux基础总结】Linux基本环境

    Linux基本环境 对Linux的基础认识 虚拟机进入终端: [root@hadoop-senior Desktop] # 用户名 主机名 所在目录名称 #:表示当前用户属于root用户,超级管理员用 ...

  7. GNU ARM 汇编基础

    ARM GNU汇编基础 0 前言 全文补充提醒: 笔者在阅读ARM官方文档及查阅实际的u-boot源码中的汇编代码后,发现了一些不同于ARM官方文档中的汇编语法,查阅相关资料后,才发现主要由于汇编器的 ...

  8. JDBC05 ResultSet结果集

    ResultSet结果集 -Statement执行SQL语句时返回ResultSet结果集 -ResultSet提供的检索不同类型字段的方法,常用的有: getString():获得在数据库里是var ...

  9. EOS基础全家桶(十一)智能合约IDE-EOS_Studio

    简介 我们马上要进入智能合约的开发了,以太坊最初提供了智能合约的功能,并宣告区块链进入2.0时代,而EOS的智能合约更进一步,提供了更多的便利性和可能性.为了进一步了解智能合约,并进行开发,我们需要先 ...

  10. 写ssm项目的注意点

    注意事项: 输出台乱码 a链接以post提交 表单提交前验证 onsubmit 属性在提交表单时触发. onsubmit 属性只在 中使用. <form action="/demo/d ...