java反射的实战教程(简单且高效)

1. 参考

建议按顺序阅读以下文章
学了这么久的java反射机制,你知道class.forName和classloader的区别吗?
Java反射(超详细!)

2. 实战

2.1 通过Class.forName()方法获取字节码
这个方法会去我们的操作系统寻找这个class文件(java编译生成的字节码文件),并将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据。

public class User {private static int a = 10;{System.out.println("普通代码块");}static{System.out.println("静态变量a:"+a);System.out.println("静态代码块");}
}// 测试
public class FDDTest {public static void main(String[] args) {try {Class forNameUser = Class.forName("com.fdd.reflect.User");System.out.println("Class.forName testing...");System.out.println("user " + forNameUser.getName());} catch (ClassNotFoundException e){e.printStackTrace();}}   
}/** 静态变量a:10静态代码块Class.forName testing...user com.fdd.reflect.User
*/

2.2 创建对象。

class ReflectTest02{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {// 通过反射机制,获取Class,通过Class来实例化对象Class c = Class.forName("javase.reflectBean.User");// newInstance() 这个方法会调用User这个类的无参数构造方法,完成对象的创建。// 重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的!Object obj = c.newInstance();System.out.println(obj);}
}

2.3 获取并调用属性Field

class ReflectFieldQuery{public static void main(String[] args) throws ClassNotFoundException {// 反射机制创建对象Class studentClass = Class.forName("javase.reflectBean.Student");//获取所有的属性Field[] fields = studentClass.getDeclaredFields();for (Field f : fields){// 获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号// 用Modifier类的toString转换成字符串String modifiers = Modifier.toString(f.getModifiers());// 获取属性的类型String typeName = f.getType().getSimpleName();// 获取属性的名字String fieldName = f.getName();}}
}class ReflectFieldUpdate{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {//使用反射机制给属性赋值Class studentClass = Class.forName("javase.reflectBean.Student");Object obj = studentClass.newInstance();Field nameField = studentClass.getDeclaredField("name");// 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)// 这样设置完之后,在外部也是可以访问private的。nameField.setAccessible(true);nameField.set(obj, "liming");System.out.println(nameField.get(obj));}

2.4 获取并调用方法Method

class ReflectMethodQuery{public static void main(String[] args) throws ClassNotFoundException {Class userServiceClass = Class.forName("java.lang.String");// 获取所有的Method(包括私有的!)Method[] methods = userServiceClass.getDeclaredMethods();for (Method m : methods){String modifiers = Modifier.toString(m.getModifiers());String returnTypeName = m.getReturnType().getSimpleName();String methodName = m.getName();Class[] parameterTypes = m.getParameterTypes();}}
}// 重点:必须掌握,通过反射机制怎么调用一个对象的方法?五颗星*****
class ReflectMethodInvoke{public static void main(String[] args) throws Exception {//使用反射机制调用方法Class userServiceClass = Class.forName("javase.reflectBean.UserService");// 创建对象Object obj = userServiceClass.newInstance();// 获取MethodMethod loginMethod = userServiceClass.getDeclaredMethod("login", String.class, String.class);Object resValues = loginMethod.invoke(obj, "admin", "123");//注:方法返回值是void 结果是nullSystem.out.println(resValues);}
}

2.5 获取并调用构造器Constructor

class ReflectConstructorQuery{public static void main(String[] args) throws ClassNotFoundException {Class vipClass = Class.forName("javase.reflectBean.Vip");Constructor[] constructors = vipClass.getDeclaredConstructors();for (Constructor c : constructors){String modifiers = Modifier.toString(c.getModifiers());String returnTypeName = c.getReturnType().getSimpleName();String methodName = c.getName();Class[] parameterTypes = c.getParameterTypes();}}
}class ReflectConstructorInvoke{public static void main(String[] args) throws Exception {Class vipClass = Class.forName("javase.reflectBean.Vip");// 调用无参数构造方法Object obj1 = vipClass.newInstance();//Class类的newInstance方法Constructor c1 = vipClass.getDeclaredConstructor(int.class, String.class, String.class, boolean.class);Object obj2 = c1.newInstance(321, "lsi", "1999-10-11", true);System.out.println(obj2);// 获取无参数构造方法Constructor c2 = vipClass.getDeclaredConstructor();Object obj3 = c2.newInstance();System.out.println(obj3);}
}

附录

Class类方法
在这里插入图片描述
Field类方法
在这里插入图片描述
在这里插入图片描述
Method类方法
在这里插入图片描述
Constructor类方法
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/289021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus如何 关闭SQL日志打印

前段时间公司的同事都过来问我,hua哥公司的项目出问题了,关闭不了打印sql日记,项目用宝塔自己部署的,磁盘满了才发现大量的打印sql日记,他们百度过都按照网上的配置修改过不起作用,而且在调试时候也及为不方…

Linux:锁定文件chattr

chattr 锁定 使用该命令进行文件的锁定以提高安全性 chattr i /etc/passwd /etc/shadow chattr i 目标文件 这样这两个文件就不能被修改了,包括root也不能去修改,但是root可以解锁后再去修改 解锁 chattr -i /etc/passwd /etc/shadow chattr -i 目标…

Ubuntu-20.04.2 mate 上安装、配置、测试 qtcreator

一、从repo中安装 Ubuntu-20.04.2的repo中,qtcreator安装包挺全乎的,敲完 sudo apt install qtcreator 看一下同时安装和新软件包将被安装列表,压缩包252MB,解压安装后933MB,集大成的一包。 sudo apt install qtcrea…

卸载MySQL——Windows

1. 停止MySQL服务 winR 打开运行,输入 services.msc 点击 “确定” 调出系统服务。 我这里只有一个,只要是以MySQL开头的全部停止 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 一般是C:\P…

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(5-检索开发)

系列文章目录 本系列课程主要针对于Ehcache缓存框架功能的开发实践全流程技术指南! 第一节:Ehcache缓存框架的基本概念和简介第二节:Ehcache缓存框架的配置分析和说明第三节:Ehcache缓存框架的缓存方式的探索第四节:E…

Linux:终端定时自动注销

这样防止了,当我们临时离开电脑这个空隙,被坏蛋给趁虚而入 定几十秒或者分钟,如果这个时间段没有输入东西那么就会自动退出 全局生效 这个系统中的所有用户生效 vim /etc/profile在末尾加入TMOUT10 TMOUT10 这个就是10 秒,按…

兼顾陪读|社科老师自费赴英国伦敦大学城市学院访学3年

T老师的孩子即将升入高中,其将访学目标定位在说英语的发达国家,要求当地公立教育资源相对丰富,且尽量延长访学时间,从而达到最优的陪读目标。最终我们获得了英国伦敦大学城市学院的3年访学邀请函,导师为社科院士&#…

四、Spring IoC实践和应用(基于XML配置方式组件管理)

本章概要 基于XML配置方式组件管理 实验一: 组件(Bean)信息声明配置(IoC)实验二: 组件(Bean)依赖注入配置(DI)实验三: IoC 容器创建和使用实验四…

Linux shell编程学习笔记37:readarray命令和mapfile命令

目录 0 前言1 readarray命令的格式和功能 1.1 命令格式1.2 命令功能1.3 注意事项2 命令应用实例 2.1 从标准输入读取数据时不指定数组名,则数据会保存到MAPFILE数组中2.2 从标准输入读取数据并存储到指定的数组2.3 使用 -O 选项指定起始下标2.4 用-n指定有效行数…

智能优化算法应用:基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工水母算法4.实验参数设定5.算法结果6.…

MySQL数据库——SQL语法

Structured Query Language(结构化查询语言),简称SQL,是用于操作关系型数据库的标准编程语言。SQL提供了一种与数据库交互的方式,可以用于查询、插入、更新和删除数据库中的数据。 1. SQL通用语法 SQL语句可以写在一…

RUST与RUSTful简介

RUST与RUSTful 1、背景2、RUST的起源3、RUST与RUSTful4、总结 1、背景 随着互联网(Internet)的发展,越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器&#xff…