一.反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
通俗的说,java虚拟机在加载类的时候会找到对应的class文件,并生成一个class对象,每个类class对象只会生成一次,就算是基本数据类型,也会有一个class对象,所以说在java中一切皆对象,这里引入一位博主的图片,我觉得概括的很好

图片来自[https://blog.csdn.net/sinat_38259539/article/details/71799078]

二.反射中使用的方法

1.获取class对象的方法

package Test;public class ReflectTest {public static void main(String[] args) throws Exception{Student s1 = new Student();Class stu1 = s1.getClass();System.out.println(stu1.getName());Class stu2 = Student.class;System.out.println(stu1==stu2);//最常用方法Class stu3 = Class.forName("Test.Student");System.out.println(stu1==stu3);}
}
class Student{
}

一般常用第三种方法,第一个都有类的实例了,第二个需要导入类包,第三个forName中的路径为绝对路径。

2.获得类的方法并调用

package Test;import java.lang.reflect.Method;
public class ReflectTest {public static void main(String[] args) throws Exception{ReflectTest obj = new ReflectTest();Method m1 = obj.getClass().getMethod("age",int.class);m1.invoke(obj, new Integer(27));m1.invoke(obj, 28);Method m2 = obj.getClass().getMethod("age",Integer.class);m2.invoke(obj, new Integer(27));m2.invoke(obj,28);}public void age(int age) {System.out.println("int age = " + age);}public void age(Integer age) {System.out.println("Integer age = " + age);}
}

输出:
int age = 27
int age = 28
Integer age = 27
Integer age = 28

3.获取类信息的系列方法

以Singer类为例子

package Test;
public class Singer {   public String name;public String sex;private String song;public Singer() {}public Singer(String name, String sex, String song) {this.name = name;this.sex = sex;this.song = song;}public void setName(String name) {this.name = name;}public void setSex(String sex) {this.sex = sex;}public void setSong(String song) {this.song = song;}public String getName() {return name;}public String getSex() {return sex;}public String getSong() {return song;}
}
package Test;
import java.lang.reflect.*;public class ReflectTest1 {public static void main(String[] args) throws Exception{Class clazz = Class.forName("Test.Singer");//获得所有方法Method[] methods = clazz.getDeclaredMethods();for (Method m: methods) {System.out.println(m);}//获取所有成员属性变量Field[] fields = clazz.getDeclaredFields();for (Field f: fields) {System.out.println(f);}//获取所有构造方法Constructor[] constructors = clazz.getDeclaredConstructors();for (Constructor c: constructors) {System.out.println(c);}}
}

输出:

    public java.lang.String Test.Singer.getName()public void Test.Singer.setName(java.lang.String)public java.lang.String Test.Singer.getSex()public java.lang.String Test.Singer.getSong()public void Test.Singer.setSex(java.lang.String)public void Test.Singer.setSong(java.lang.String)public java.lang.String Test.Singer.namepublic java.lang.String Test.Singer.sexprivate java.lang.String Test.Singer.songpublic Test.Singer()public Test.Singer(java.lang.String,java.lang.String,java.lang.String)

三. 总结

  • 获得Class对象
  • 调用Class的方法
  • 使用反射API来操作信息

转载于:https://www.cnblogs.com/authetic/p/8972091.html

Java 基础总结--反射的基本操作相关推荐

  1. java基础之 反射_Java基础之反射原理与用法详解

    本文实例讲述了Java基础之反射原理与用法.分享给大家供大家参考,具体如下: 1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx& ...

  2. 学习Spring必学的Java基础知识----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  3. Java基础之—反射(非常重要)

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  4. Java基础:反射的详细介绍与使用

    我是 ABin-阿斌:写一生代码,创一世佳话. 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦. 一.具体介绍 反射机制的概述   Java 反射机制是在运行状态中,对于任意一个类,都能够 ...

  5. 搞定Java基础:反射机制

    反射机制是Java语言多态的体现,估计大家接触最早的代码可能是jdbc的一行代码吧. Class.forName("com.mysql.jdbc.Driver.class").ne ...

  6. (CZ深入浅出Java基础)反射

    一.类的加载 1.类初始化的时机 创建类的实例 访问类的静态变量,或者为静态变量赋值 调用类的静态方法 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 ...

  7. Java基础巩固——反射

    什么是反射 反射机制就是指程序运行时能够获取自身的信息.在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 在jdbc中就是使用的反射来实例化对象,比如:Class. ...

  8. [Java基础] Properties类的基本操作和介绍

    引言 Java中的.properties文件是一种配置文件,主要用于表达配置信息:通俗来说,存放的数据就像是Map中的key和value的对应关系一样:这样就可以通过键值对来对属性进行匹配,并且属性列 ...

  9. Java基础-通过反射获取类的信息

    目录 1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8.反射Constructor ...

  10. java基础之反射类型Type

    Java在加入泛型之后,仅仅Class已经不足以描述数据的类型了,比如List类型的数据,其Class的类型为List.class,但是其类型包含了泛型参数,所以java引入了Type类型来描述泛型类 ...

最新文章

  1. C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)
  2. spring cloud config配置中心源码分析之注解@EnableConfigServer
  3. DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
  4. 使用flot.js 发现x轴y轴无法显示轴名称
  5. 国内学生宿舍最“豪华”的4所大学,清华大学排第3,第1当之无愧
  6. 【C语言】输入一个整数x并判断x是否存在于数组a中
  7. 剑指OFFER之包含min函数的栈(九度OJ1522)
  8. 创建微服务多模块项目
  9. java day37【web相关概念回顾 、web服务器软件:Tomcat 、Servlet入门学习】
  10. boost::bind 与 boost::function 的使用方法例子
  11. 上市公司风险预警案例可视化演示系统(附代码)
  12. 托业考试心得(930分;人大教材;6级500分水平,20天复习)
  13. 公务员考试152分上岸经验,你同样可以复制
  14. android studio海马玩模拟器
  15. 例 9.7 有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。
  16. 『统计学』常用的数据分析方法都在这了!Part.2
  17. TCP/IP 面试题整理
  18. 题目中的英语短语积累
  19. 数字孪生十问:分析与思考
  20. 谈谈目前工作的收获和不足

热门文章

  1. 无外网环境下CentOS 7安装MySQL 5.7.18
  2. POJ 3729 Facer’s string 题解《挑战程序设计竞赛》
  3. 没有Angular 3,下一个Angular主版本将是Angular 4
  4. 基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
  5. ubuntu下如何切换到root用户 --- 终端命令行方式
  6. Maven安装及与Eclipse集成
  7. 解决问题--Maven,IDEA项目External Libraries下只有jdk没有maven依赖
  8. 非科班前端人的一道送命题:0.1+0.2 等于 0.3 吗?
  9. 百度开源超级链技术方案!
  10. 微信支付宝神仙打架,谁家健康码能一统天下?