JAVA反射机制初步理解
Java中我们这样声明一个类,如人类
package cn.com.lcx.test;public class Person {public String sex = "男";private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void say(){System.out.println("姓名:"+name+",年龄:"+age+","+sex);}
}
这是一个Person类型,java 类库中有 String类型,
不管是我们自定义的 类型还是 java类库中的类型 它们都有 构造函数、成员函数、成员属性,java中对象是对客观事物的抽象,类是对对象的抽象,所以java将所有的类型抽象成这样一个类型:Class类型。
我们用Person 类声明一个对象,Person p = new Person(); 这代表了一个具体的人类对象。
而我们的Class 类的对象就是具体的类如Person类,或者可以说是 Person类的那份二进制代码。我们可以通过以下3种方式声明Class 类的对象
Person person = new Person();
Class personClass1 = Person.class;//类名.class
Class personClass2 = person.getClass();//Person类对象的getClass方法
Class personClass3 = Class.forName("cn.com.lcx.test.Person");//类完整路径
这样我们就获取到了Person类的代码,Class 类 api中可以通过如下方法获取到 Class对象的构造函数、成员函数、成员属性等类元素的反射对象。
反射对象类,都在java.refect包总定义,主要有以下3个反射类:
Constructor.class:类中构造函数反射类
Method.class:类中方法反射类
Field.class:类的成员属性反射类
反射类和普通类一样都是对共有东西的抽象。
普通的方式访问成员函数或者成员属性是通过具体的对象去进行访问,
而反射是方法/属性对象针对某个具体对象进行调用或者访问的,这普通的方式好像是反着的,可能这就是反射的由来吧。
下面举个简单的例子进行抛砖引玉
package cn.com.lcx.test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class Refect {@SuppressWarnings({ "rawtypes", "unchecked" })public static void main(String[] args) throws Exception {//普通方式:实例化对象、调用方法、访问属性Person person = new Person("普通人",0);//构造函数调用person.sex = "男";//访问属性person.say();//调用方法Class personClass1 = Person.class;//类名.classClass personClass2 = person.getClass();//Person类对象的getClass方法Class personClass3 = Class.forName("cn.com.lcx.test.Person");//类完整路径//Person类的构造函数反射类对象Constructor personConstructor = personClass1.getConstructor(String.class,int.class);System.out.println("通过反射实例化对象---------");//通过构造函数反射类对象实例化Person类对象Person person1 =(Person) personConstructor.newInstance("张一",1);Person person2 = (Person) personConstructor.newInstance("张二",2);Person person3 = (Person) personConstructor.newInstance("张三",3);person1.say();person2.say();person3.say();System.out.println("通过反射实现对对象成员方法调用---------");//Person类的成员函数反射类对象Method method = personClass2.getMethod("setName",String.class);method.invoke(person1, "李一");method.invoke(person2, "李二");method.invoke(person3, "李三");person1.say();person2.say();person3.say();System.out.println("通过反射实现对成员属性的访问---------");//Person类的成员属性反射类对象Field field = personClass3.getField("sex");//获取公有属性/*** 获取私有属性或者私有方法用getDeclaredXXX方法,* 如果想访问私有成员那么该属性对象或者方法对象要设置setAccessible(true)方法*/Field fieldPrivate = personClass3.getDeclaredField("name");fieldPrivate.setAccessible(true);//设置可以访问私有属性fieldPrivate.set(person, "反射人");person.say();field.set(person1, "男人");field.set(person2, "女人");field.set(person3, "人妖");person1.say();person2.say();person3.say();}
}
JAVA反射机制初步理解相关推荐
- Java反射机制的理解和在项目中的应用场景
Java反射机制的理解 Java程序中的对象在运行时可以表现为两种类型,即编译时类型和运行时类型.例如 Person p = new Student(); ,这行代码将会生成一个p变量,该变量的编译时 ...
- 关于java反射机制(基础篇)
关于java的反射机制,有一些初步的理解,但是依然存在几点困惑.先将自己理解的部分分享其下,并提出困惑,之后完善. 1. java反射机制是什么? 从两个概念切入:反射机制和java反射机制 ①反射机 ...
- java反射机制原理,为什么需要反射,反射的作用
最近在学java反射以及动态代理,好多博客都写的十分官方.就自己整合些资料.加深java反射机制的理解. 在说反射之前,我们要先了解动态语言和静态语言的概念: 动态类型语言 所谓动态类型语言,就是类型 ...
- Java - 反射机制
Java反射机制 Java反射机制概述 理解Class类并获取Class实例 类的加载与ClassLoader的理解 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 反射的应用:动 ...
- 深入理解java反射机制
一,java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): Java虚拟机:是运行所有Java程序 ...
- 秒懂系列,深入理解Java反射机制
文章目录 深入理解Java反射机制 一.Java反射概述 二.Java创建对象思想传递 三.类对象 3.1 类对象和类的对象 3.2 三种获取类对象的方法 四.Class对象的常用方法 4.1 获取成 ...
- 理解Java反射机制
理解Java反射机制 1. 概述 2. 反射原理 3. 反射的优缺点 4. 反射的用途 5. 反射相关的类 5.1 Constructor 5.2 Field 5.3 Method 5.4 Class ...
- 【重铸Java根基】理解Java反射机制
最近带应届新员工,教然后知不足,发现自己把很多基础知识已经还给了大学老师,因此开贴,温故而知新! 从最基础的Java知识开始由浅入深,在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开. 本 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
最新文章
- 静态方法多次调用内存_java虚拟机的内存分析
- weblogic创建域后启动不了_WebLogic的Azure虚拟机主要版本发布
- 如何在SAP云平台上创建Redis实例
- hadoop之 Hadoop2.2.0中HDFS的高可用性实现原理
- 【转】Serverless架构
- 第二届字节跳动夏令营启动全球报名,图灵奖得主授课
- Atitit 依赖管理之道 1. 概念 依赖管理,是指在什么地方以什么形式引入外部代码。	1 1.1.1. 理解模块化和依赖管理:	1 1.2. 依赖管理,有三个层面。 单一职责原则,协议对象引用,
- 51单片机之实时秒表
- 【物流推荐】HEGERLS堆垛机—自动化立体仓库中最重要的起重运输设备
- csma研究背景_CSMA/CD协议的特点
- PHP使用FPDF的多字体解决
- 量子科技商业化寻路,资本造势但技术落地成难|科股宝
- 计算机桌面设置怎么还原,怎么把电脑桌面还原
- 云计算技术与应用赛项赛题库
- 全局择优搜索、A*算法、宽度优先算法解决八数码问题
- 【导数术】1.导数基本公式
- AndroidStudio安装SVN时忘记勾选command line client tools解决方案
- 微信网页授权的制作步骤
- webpack的构建流程
- 第二十章 分布式任务调度中心DolphinScheduler架构设计
热门文章
- python pygame模块_python中pygame模块用法实例
- P5726 【深基4.习9】打分(python3实现)
- P5706 【深基2.例8】再分肥宅水(python3实现)
- vue部署到服务器_利用Gulp实现代码自动化部署
- 服务器主机安装esxi虚拟机,服务器主机安装esxi虚拟机
- dio拦截器 flutter_详解flutter之网络请求dio,请求,拦截器简单示例
- C++笔记-函数参数使用void *的野路子
- Qt笔记-解决键盘事件不能正常响应(其他响应事件通用)
- Java工作笔记-JPA查询达梦7数据库(Spring Boot + ORM)
- C++笔记-shared_ptr与weak_ptr需要注意的地方