反射setaccessible_advancedday16类加载器,反射

加载配置文件

在src目录下创建一个config.properties配置文件,使用类加载器加载配置文件。

 //创建集合Properties properties=new Properties();//获取src目录下,配置文件的流InputStream in = ClassLoader.getSystemClassLoader()    .getResourceAsStream("config.properties");//加载配置文件到集合properties.load(in);

反射

反射指的是在运行时,动态的获取任意一个类的任意属性和方法。其中属性用Field表示,方法用Method表示,构造方法用Constructor表示。

74de383f33d68d87f172b94eec799570.png

获取字节码

 //1. Class.forName("类的全限定名")Class clazz1 = Class.forName("com.itheima.Student");//2. 类名.classClass clazz2 = Student.class    //3. 对象名.getClass()Class clazz3 = stu.getClass();

反射获取构造方法

 //获取字节码对象Class> clazz = Class.forName("com.itheima.demo.Student");//获取构造方法Constructor> con1 = clazz.getConstructor();//使用空参数构造方法创建对象Object stu1 = con1.newInstance();   //等价于 new Student();System.out.println(stu1);//获取有一个参数的构造方法Constructor> con2 = clazz.getDeclaredConstructor(String.class);con2.setAccessible(true); //取消权限检查(暴力反射)Object stu2 = con2.newInstance("张三"); //等价于  new Student("张三");System.out.println(stu2);//获取有两个参数的构造方法Constructor> con3 = clazz.getConstructor(String.class, int.class);Object stu3 = con3.newInstance("李四", 25); //等价于  new Student("李四",25);System.out.println(stu3);  

反射获取成员变量并使用

  Field  getField(String name)       通过属性名获取一个成员变量 Field[] getFields()       获取所有public修饰的成员变量 Field  getDeclaredField(String name)       通过属性名获取一个私有的成员变量 Field[] getDeclaredFields()       获取所有的成员变量(既包括私有,也包括公有)
 Class> clazz = Class.forName("com.itheima.demo2.Student");//创建Student对象Object stu = clazz.getConstructor().newInstance();//获取name变量Field field1 = clazz.getDeclaredField("name");//暴力反射field1.setAccessible(true);//给变量设置值field1.set(stu,"张三");  //等价于  stu.setName("张三");System.out.println(stu);//获取变量的值Object value = field1.get(stu);  //等价于 stu.getName();System.out.println(value);System.out.println("----------------");Field field2 = clazz.getField("sex");field2.set(stu,"男");System.out.println(stu);Object value2 = field2.get(stu);System.out.println(value2);

获取成员方法并使用

 public Method getMethod(String name, Class>... parameterTypes)      获取一个公有的成员方法public Method[] getMethods()     获取所有公有的成员方法(包括父类的方法)public Method   getDeclaredMethod(String name, Class>... parameterTypes)     获取一个私有成员方法 Method[] getDeclaredMethods()     获取所有的成员方法(既包括私有,也包括公有)
 Class> clazz = Class.forName("com.itheima.demo3.Student");//创建对象Object stu = clazz.getConstructor().newInstance();//获取一个成员方法   public void show()Method m1 = clazz.getMethod("show");m1.invoke(stu); //执行方法  对象.show();//获取一个成员方法, private void show(String name)Method m2 = clazz.getDeclaredMethod("show", String.class);m2.setAccessible(true);m2.invoke(stu,"张胜男");//获取一个成员方法, void show(String name,int age)Method m3 = clazz.getDeclaredMethod("show", String.class, int.class);m3.invoke(stu,"李四",20);//获取一个成员方法,protected int  sum(int a,int b)Method m4 = clazz.getDeclaredMethod("sum", int.class, int.class);Object obj = m4.invoke(stu, 4, 8);System.out.println(obj);

配置文件+反射

  • 写一个配置文件config.properties

 #类名classname=com.itheima.demo4.Teacher#方法名methodname=teach
  • 读取配置文件,通过反射获取相应的类和方法

public class Demo4 {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//读取配置文件
Properties properties=new Properties();
//获取配置文件的字节流
InputStream inputStream =
ClassLoader.getSystemClassLoader()
.getResourceAsStream("config.properties");
properties.load(inputStream);
//获取类名
String classname = properties.getProperty("classname");
//获取方法名
String methodname = properties.getProperty("methodname");
//获取类对应的字节码
Class> clazz = Class.forName(classname);
//创建对象
Object obj = clazz.getConstructor().newInstance();
//获取方法
Method m = clazz.getDeclaredMethod(methodname);
//让方法执行
m.invoke(obj);
}
}

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

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

相关文章

eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

eventbus多个订阅在查看Google的Guava库版本10的最新添加内容时,我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型,但是消息保留在应用程序内,而不是在外部广播。 EventBus允许您在程…

python 字段升序,python 根据两个字段排序, 一个升序, 一个降序

SSL双向认证java实现(转)本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...List和Tuple类型list列表,list是一种有序的…

元气骑士如何获得机器人成就皮肤_元气骑士:机器人成就皮肤该怎么获得?百场老机器人教你走位...

【元气骑士我最行,不爱红武爱老云】各位亲爱的读者大家好,我是百场老机器老云。自从《元气骑士》更新出了特典皮肤之后,众多玩家开始了自己的成就之旅。有很多老玩家能够轻松完成这些成就,但是对于不少接触这款游戏不久的玩家来说…

Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符

使用Elasticsearch 5,我们有一个字段,例如驾驶执照编号,其中的值可能包含特殊字符,并且由于用户在有限的验证范围内输入了值,因此值的大小写不一致。 例如,这些是假设值: CA-123-456-789 WI.1…

python代码编程软件_编程与编程软件(python-pycharm)

课程安排编辑语言之python数据库软件之mysql今日内容概要编程与编程语言计算机存储内部工作原理编程语言的发展史解释型语言与编译型语言python解释器版本及下载安装编写python程序的编辑器(提升编码效率)变量的概念变量名的命名规范变量名的书写风格今日内容详细编程与编程语言…

基于matlab的语音信号,科学网—[转载]【信息技术】【2014.06】【含源码】基于MATLAB的语音信号处理与分析 - 刘春静的博文...

本文为瑞典耶夫勒大学(作者:Nan Wu)的学士论文,共48页。语音传递是人类最重要、最有效、最常用的信息交流方式。语言是人类特有的特征,而人声是常用的工具,也是相互传递信息的重要途径。语音具有较大的信息容量。因此,…

mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

你需要知道的之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。行锁记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。生活中的间隙锁编程的思想源于生活…

string.intern_使用String.intern()减少内存使用

string.intern时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此,并认为分享最近的一个战争故事会很有趣。 在这种情况下,我们就有机会使用String.intern()之类的简单补丁来修补应用程序。 …

测量string变量长度函数_利用Graphics::MeasureString函数测量字符串的宽度,高度

我就吐一句槽,今天被这个函数完虐....当我们需要获得一个字符串的长度时(注意,不是length,这只是返回该字符串的字符个数),我们需要知道的是一个字符串的长度也就是一个字符串的宽,说到底就是像素大小,没错…

首选System.lineSeparator()以用Java编写系统相关的行分隔符字符串

JDK 7在java.lang.System类上引入了一个名为lineSeparator()的新方法。 该方法不期待任何参数,并返回一个String ,它表示“取决于系统的行分隔符字符串。” 此方法的Javadoc文档还指出System.lineSeparator() “始终返回相同的值–…

微信批量退款php,微信支付退款接口详解

微信支付有2个退款相关的接口,分别是申请退款API和查询退款API,这2个接口在实际微信支付开发中都会用到。其中申请退款API因为安全性,需要使用证书,证书在商户平台后台下载.申请退款接口支持一年以内的订单退款,可以分…

1235813找规律第100个数_人教版一年级下册数学第1-8单元知识点梳理填空,附答案...

参考答案:第一单元 认识图形1、认识平面图形 2、平面图形的拼组用相同的正方形、长方形或三角形可以分别拼成更大的正方形、长方形或三角形。3、认识七巧板 七巧板是由1个正方形、1个平行四边形、5个三角形组成的。第二单元 20以内的退位减法1、十几减几的计算方法(…

php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?

我有一组并行运行的进程.有时有些闲荡时间超出了脚本的预期范围&#xff1a;$time_start microtime(true)$max_run_time 30 * 60; // 30 minutes, measured in secondswhile ((microtime(true)-$time_start) < $max_run_time) {// do stuff, but quit after 30 minutes}我…

透视变换–鸟瞰图_单例设计模式–鸟瞰

透视变换–鸟瞰图几天前&#xff0c;当我回到家乡时&#xff0c;我的一位来自同事的准青年参加了一家跨国公司的采访&#xff0c;在采访过程中受了重伤。 我的意思是&#xff0c;由于面试小组提出了一些难题&#xff0c;他无法使面试合格。 当我回到班加罗尔时&#xff0c;他分…

pandas整表写入excel指定位置_当Python遇到Excel,一个能打的都没有~

几乎人人都在用Excel&#xff0c;这种极易上手的数据分析工具无处不在&#xff0c;一旦你掌握了窍门&#xff0c;它就变得非常强大。而Python通常被认为更具有挑战性&#xff0c;但能做的事也更多。当Python遇到Excel会发生什么&#xff1f;本文将告诉你&#xff0c;这三项Exce…

linux用户密码转换为明文,Linux运维知识之linux下抓取内存中明文密码mimipenguin

本文主要向大家介绍了Linux运维知识之linux下抓取内存中明文密码mimipenguin&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习Linux运维知识有所帮助。下载地址&#xff1a;https://github.com/huntergregal/mimipenguin 基本使用语法&#xff1a;rootkali:~/e…

无需再忙了:Lambda-S3缩略图,由SLAppForge Sigma钉牢!

如果你还没有注意到了&#xff0c;我最近被唠叨试图开始使用时&#xff0c;我遭遇了陷阱AWSλ-S3正式例子 。 虽然大多数这些愚蠢的错误的指责是对我自己的懒惰&#xff0c;过度自尊和缺乏对细节的关注&#xff0c;我个人觉得&#xff0c;在开始与一家领先的无服务器供应商不应…

wap(dopra linux )命令,运营商定制的华为光猫Telnet命令恢复华为界面

首先Telnet连接光猫Welcome Visiting Huawei Home GatewayCopyright by Huawei Technologies Co., Ltd.Login:rootPassword:User name or password is wrong, please try it again!Login:rootPassword:adminWAP>suERROR::Command is not existedWAP>lsERROR::Command is …

请简述gouraud光照模型_《计算机图形学》试卷及答案

一、填空题(每空0.5分&#xff0c;共 1 0 分)1、 计算机图形学中的图形是指由点、线、面、体等 和明暗、灰度(亮度)、色彩等 构成的&#xff0c;从现实世界中抽象出来的带有灰度、色彩及形状的图或形。 2、 一个计算机图形系统至少应具有 、 、输入、输出、 等基本功能。3、 常…

linux下运行yolo,Ubuntu下CPU/GPU模式YOLOv3代码运行

YOLO是近几年物体检测主要算法之一&#xff0c;2018年已发展到YOLOv3&#xff0c;是目前速度最快的物体检测算法&#xff0c;详细内容可查看YOLO主页。YOLO的主要优势在于基于纯C语言编写的DarkNet&#xff0c;可查看DarkNet主页&#xff0c;不需要其他依赖库&#xff0c;跨平台…