java反射机制梳理
java反射机制梳理
Java反射简介
- 反射简介
- 编译和运行
- 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
- 要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。
- Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
- Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
- 编译和运行
- java反射有什么用
- 假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
- 得到反射的三种方法
- 类.class;
- 对象.getClass();
- Class.forName("类的全称"),不仅表示了,类的类类型,还代表了动态加载类
- 三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
- 一个类里都有什么
- 类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。
- 属性有几部分组成
- 修饰符、类型、属性名、属性值四部分组成。
- 方法有几部分组成
- 修饰符、返回类型、方法名、参数列表、方法体、返回值
- 构造器有几部分组成
- 修饰符、构造器名称(类名)、参数列表、方法体
java.lang.Class类
- java.lang.Class类介绍
- 要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
- Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。
- 类是对象,类是java.lang.Class类的实例对象
反射的演示
Class clazz = Class.forName("fanshe.Student");
"*******************************构造方法*******************************"
Constructor[] conArray = clazz.getConstructors(); //所有公有构造方法
conArray = clazz.getDeclaredConstructors(); //所有的构造方法(包括:私有、受保护、默认、公有)
Constructor con = clazz.getConstructor(null); //获取私有构造方法,并调用
con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
obj = con.newInstance('男'); //构造函数调用
"*******************************成员变量*******************************"
Field[] fieldArray = stuClass.getFields(); //获取所有公有的字段
fieldArray = stuClass.getDeclaredFields(); //获取所有的字段(包括私有、受保护、默认的)
Field f = stuClass.getField("name"); // 获取公有字段name
Object obj = stuClass.getConstructor().newInstance(); //字段调用:实例 赋值 调用
f.set(obj, "刘德华");//为Student对象中的name属性赋值
Student stu = (Student)obj;
System.out.println("验证姓名:" + stu.name);
"*******************************成员方法*******************************"
Class stuClass = Class.forName("fanshe.method.Student");
stuClass.getMethods(); //获取所有的”公有“方法
methodArray = stuClass.getDeclaredMethods(); //获取所有的方法,包括私有的
Method m = stuClass.getMethod("show1", String.class); //获取公有的show1()方法
Method m = stuClass.getDeclaredMethod("show4", int.class); //获取私有的show4()方法并调用
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20); //调用
- 参考:https://blog.csdn.net/sinat_38259539/article/details/71799078
- https://www.cnblogs.com/albertrui/p/8366406.html
java反射机制梳理的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- 反射——Java反射机制
反射概述 什么是反射? ① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ② JAVA反射机制是在运行状态中,对应任意一个类,都能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
随机推荐
- AbstactFactory模式
AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象. AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteF ...
- docker 使用elasticsearch+logstash
1.1部署elasticsearch:6.5.4 docker pull elasticsearch:6.5.4 docker run -d --name elasticsearch -p 9200: ...
- 记录安装Python第三方包“tesserocr”的方法和遇到的坑
1. 环境: 系统环境:Win7 32 位系统 Python版本: 3.6.5 虚拟环境为:Miniconda3 2. 共需要安装的模块: a. tesserocr b. tessera ...
- jsp中点击一个图片跳转到另一个页面的方法
1.这是jsp页面中的关于图片的那段代码 <img src="images/tj1.png " id="tj1"></img> 2.跳转 ...
- [梁山好汉说IT] 以水浒传为例讲解贝叶斯定理
0x00 摘要 看看呼延灼如何利用贝叶斯定理来判断 "自己是否是公明哥哥的心腹". 0x01 IT概念 1. 贝叶斯定理 贝叶斯定理是用来解决"逆概率"问题的, ...
- Gif动图压缩java版
简单说明下,如果不是压缩动图的话只用java本身的包足够实现压缩和截取图片了,为了能够压缩gif动图,这里引用了两个文件 AnimatedGifEncoder 和 GifDecoder, 先用Deco ...
- centos服务器cpu百分之百,top查询不到之“-bash”
把这条注释掉. [root@aaaa ~]# cat /etc/ld.so.preload #/usr/local/lib/libproc.so[root@aaaa ~]# 然后在top
- 电脑端TIM登录时记住密码
为什么每次登录TIM时点了记住密码,下次再登录时还是记不住呢? 不是扫码就是还得输出密码,为这事愁了好多次, 最近终于发现如何记住密码了... 进入登录界面以后,点击左下角这个小图标>> ...
- Ural1057. Amount of Degrees 题解 数位DP
题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...
- 「Luogu P2201」数列编辑器 解题报告
数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我