Java--反射机制——反射 API(Day_04)
生活中迷茫感的产生,往往源之于坚持一件事放弃的那一刻,因为从那一刻起,你开始变得无聊,变得没有方向感。
运行环境
JDK8 + IntelliJ IDEA 2018.3
本文中使用的jar包链接
https://files.cnblogs.com/files/papercy/jsoup_jar%E5%8C%85.rar
概述
1、Java反射机制(Java-Reflect):
ava 反射是Java语言的一个很重要的特征,它使得Java具有了“动态性”。
Java提供了一套机制来动态获取类的信息以及动态调用对象的方法的功能,这套机制就叫——反射
在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
反射机制是如今很多流行框架的实现基础,其中包括Struts、Spring、Hibernate等。
反射是Java开发中一个非常重要的概念,掌握了反射的知识,才能更好的学习Java高级课程.
2、Java 反射机制的功能
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
生成动态代理。
通过JAVA反射查看类信息
1、获得Class对象
每个类被加载之后,系统就会为该类生成一个对应的Class对象。通过该Class对象就可以访问到JVM中的这个类。
在Java程序中获得Class对象通常有如下四种方式:
- obj.getClass();
Object obj=new String();
Class clz1 = obj.getClass();
System.out.println("第一种:"+clz1);
- class属性
Class clz2 = String.class;
System.out.println("第二种:"+clz2);
- Class.forName();
Class clz3 = Class.forName("java.lang.String");
System.out.println("第三种:"+clz3);
- ClassLoader
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class clz4 = cl.loadClass("java.util.ArrayList");
System.out.println("第四种:"+clz4);
运行结果:
构造方法
public static void main(String[] args) throws Exception {
//反射string 类的所有构造方法
Class clz = Student.class;
System.out.println("所有构造方法:");
Constructor[] cons = clz.getConstructors();
cons = clz.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println("访问修饰权限:" +
Modifier.toString(con.getModifiers()));
System.out.println("方法名:" + con.getName());
System.out.println("****************************");
System.out.println(Modifier.toString(con.getModifiers()) + " "
+ con.getName());
} System.out.println("=============================="); //找无参的构造方法
Student s = new Student();
Constructor con = clz.getDeclaredConstructor();
Object obj = con.newInstance();
System.out.println(obj); //找带string,int类型参数的构造方法
Student s1 = new Student("zhangsan",12);
con = clz.getDeclaredConstructor(String.class, int.class);
obj = con.newInstance("zhangsan", 12);
System.out.println(obj); con = clz.getDeclaredConstructor(String.class); }
运行结果:
Class中的常用方法(获得类的属性)
1 public static void main(String[] args) throws Exception {
2
3 Class clz = Student.class;
4
5 System.out.println("得到所有字段:");
6 Field[] fields = clz.getDeclaredFields();
7 for(Field field : fields) {
8 System.out.println(Modifier.toString(field.getModifiers())+" " + field.getType().getSimpleName() + " " + field.getName());
9 }
10 //利用反射为s学生对象的两个属性字段赋值
11 Student s= new Student();
12 Class clzz = s.getClass();
13 System.out.println(clzz);
14 System.out.println("======================");
15
16 //为x字段赋值
17 Field field_x = clzz.getField("x");
18 field_x.set(s, "feifeiye");
19 System.out.println(s.x);
20 System.out.println("======================");
21
22 //得到name字段
23 Field field_name = clzz.getDeclaredField("name");
24 field_name.setAccessible(true);
25 field_name.set(s, "zhangsan");
26 field_name.setAccessible(false);
27
28 Field field_age = clzz.getDeclaredField("age");
29 field_age.setAccessible(true);
30 field_age.set(s, 20);
31 field_age.setAccessible(false);
32 System.out.println(s);
33
34 }
运行结果:
Class中的常用方法(获得类的方法)
1 public static void main(String[] args) throws Exception {
2 Class clz = Student.class;
3
4 Method[] methods = clz.getDeclaredMethods();
5 for (Method method : methods) {
6 Class[] clzz = method.getParameterTypes();
7 String temp = "";
8 for(Class cz:clzz) {
9 temp += cz.getSimpleName()+",";
10 }
11
12 System.out.println(Modifier.toString(method.getModifiers()) + " "
13 + method.getReturnType().getSimpleName() + " "
14 + method.getName()+"("+temp+")");
15 }
16
17
18 //调用类无参的构造方法实例化对象
19 Student st = (Student)clz.newInstance();
20
21 //调用无参的构造方法实例化
22 Student st1 = (Student)clz.getConstructor().newInstance();
23
24
25 //得到fun1方法并调用
26 Method method_fun1 = clz.getMethod("fun1", String.class, int.class);
27 method_fun1.invoke(st, "feifeiye", 100);
28
29
30 Method method_fun2 = clz.getMethod("fun2", String.class, int.class, double.class);
31 Object returnValue = method_fun2.invoke(st, "feifeiye",200, 3.14);
32 System.out.println(returnValue);
33
34
35 }
运行结果:
反射动态调用类的成员
调用方法步骤:
- 设定调用方法的参数列表(Class[])
- 获得调用方法的对象(Method)
- 设定调用方法的参数的值(Object[])
- 普通方法:invoke(obj,values);
- 构造方法:newInstance(values)
调用属性步骤:
- 根据属性名字获得属性对象(Field)
- 赋值:set(obj,value)
- 取值:get(obj)
- 如果需要强制访问类的私有成员,则需要设定:setAccessible(true);
总结
Class是一个特殊的类,它的实例用来表示一个.class文件在内存中的存在形势。
反射就是照镜子,照出类的内部结构。
利用反射,可以在运行状态下初始化类。
Java--反射机制——反射 API(Day_04)的更多相关文章
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- <Java><类加载机制><反射>
类加载过程 类从被加载到虚拟机内存开始,直到卸载出内存,它的整个生命周期包括:加载(Loading), 验证(Verification), 准备(Preparation), 解析(Resolution ...
- java 反射机制01
// */ // ]]> java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...
- 【java提高】---java反射机制
java反射机制 一.概述 1.什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
- Java 反射机制应用实践
反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start(https://docs.oracle.com/javase/ ...
- Java中的反射机制
Java反射机制 反射机制定义 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的 ...
- java反射机制的简单使用
java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- day11 Java反射机制
java反射机制 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...
随机推荐
- 解决Spring中使用Example无法查询到Mongodb中的数据问题
1 问题描述 在Spring Boot中使用Mongodb中的Example查询数据时查询不到,示例代码如下: ExampleMatcher matcher = ExampleMatcher.matc ...
- 自定义函数和调用函数 return返回值
1.Q: 为什么要有函数,函数是什么? A: 函数能提高应用的模块性,和代码的重复利用率 2. 函数分为两个阶段: 1.定义阶段 2.调用阶段 3.关于函数调用: 01.函数的内存地址加上()就是调用 ...
- JMeter发送get请求并分析返回结果
在实际工作的过程中,我们通常需要模拟接口,来进行接口测试,我们可以通过JMeter.postman等多种工具来进行接口测试,但是工具的如何使用对于我们来说并不是最重要的部分,最重要的是设计接口测试用例 ...
- 通过Python实现对SQL Server 数据文件大小的监控告警
1.需求背景 系统程序突然报错,报错信息如下: The transaction log for database '@dbname' is full. To find out why space in ...
- 一次ssh不能登陆问题
看提示应该是进程数满了 ps -eLf | wc -l 查看当前进程数 [root@qc-app-16-63 containers]# ps -eLf | wc -l2625 查看允许最大进程数 s ...
- IDEA关于-javaagent中文路径导致无法debug的初步解决方案
IDEA明明是装在D盘的纯英文路径,而且java的相关环境变量全部是在英文路径,结果还是因为中文路径的问题导致无法debug.仔细观察,发现这个中文路径是作为java的-javaagent的参数输入的 ...
- 【Jwt】JSON Web Token
一.什么是JSON Web Token: 首先要明确的是JSON Web Token:是一个开放标准,这个标准定义了一种用于简洁,自包含的用于通信双方之间以JSON对象的形式安全传递信息的方法 而我们 ...
- hdu4302 set或者线段树
题意: 一条蛇生活在一个管子里,然后管子上面的某些位置会一次出现食物,每次蛇都会吃最近的食物,吃完之后就原地不动,等待下一次吃食物,如果有两个食物距离蛇一样远并且都是最近的,那么蛇不会掉头 ...
- Python中的optparse模块的使用
optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数. 实例化一个 OptionParser 对象(可以带参,也可以不带参数),带参的话会把参数变量的内容作为帮助信息输 ...
- 手撸了一个starter,同事直夸我666~
Spring Boot starter原理 Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!st ...