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中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...
随机推荐
- Digit Counting UVA - 1225
Trung is bored with his mathematics homeworks. He takes a piece of chalk and starts writing a sequ ...
- JAVAEE_Servlet_21_Cookie
Cookie * Cookie 是什么? - Cookie翻译过来是曲奇饼干的意思 - Cookie可以保存回话状态,但是这个会话状态是保存在客户端上的,只要清除Cookie,或者 Cookie失效, ...
- Day05_25_Super关键字
Super关键字 Super关键字的所用 Super关键字的用法有三种: 在子类的成员方法中,访问父类的成员变量. 在子类的成员方法中,访问父类的成员方法. 在子类的构造方法中,访问父类的构造方法. ...
- 重绘DevExpress的XtraMessageBox消息提示框控件
先来看提示框,可以看到框其实是一个去掉最大化.最小化按钮后的窗体,窗体的内容就是我们想要提示的内容,重绘提示框其实就是重绘窗体以及中间部分的内容. 首先重绘窗体,消息提示框的窗体不是XtraForm而 ...
- 使用vue-element-admin框架从后端动态获取菜单
1.前言 vue-element-admin是一个纯前端的框架,左侧菜单是根据路由生成的.实际开发中经常需要根据当前登陆人员的信息从后端获取菜单进行展示,本文将详细介绍如何实现该功能. 2.详解 ...
- NodeJS中的LRU缓存(CLOCK-2-hand)实现
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.codeproject.com/Articles/5299328/LRU- ...
- spring boot 项目从配置文件中读取maven 的pom.xml 文件标签的内容。
需求: 将pom.xml 文件中的版本号读取到配置文件并打印到日志中. 第一步: 在pom.xml 中添加以下标签. 第二步: 将version 标签的值读取到配置文件中 这里使用 @@ 而不是 ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- (CV学习笔记)看图说话(Image Captioning)-1
Background 分别使用CNN和LSTM对图像和文字进行处理: 将两个神经网络结合: 应用领域 图像搜索 安全 鉴黄 涉猎知识 数字图像处理 图像读取 图像缩放 图像数据纬度变换 自然语言处理 ...
- web.xml 基本配置(SSM maven项目)
<web-app> <display-name>Archetype Created Web Application</display-name> <!--we ...