反射【一】

前言

|ू・ω・` )
在进行可以通过XML文件解析后,可以获取到指定的路径,
在获取到路径后,我们可以干一些什么了。

  1. 可以通过路径实列一个class文件。

我们可以用class文件可以实列化对象,查看读写属性,调用方法

初识反射


反射的概念

反射:反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
如图:
在这里插入图片描述

优点:

  1. 反射提高了程序的灵活性扩展性
  2. 降低耦合性,提高自适应能力。
  3. 它允许程序创建控制任何类的对象,无需提前硬编码目标类。

缺点:

  1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性拓展性要求很高的系统框架上,普通程序不建议使用。

  2. 使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。


反射的使用:实例化对象,查看读写属性,调用方法

实列化对象

首先要实列化对象,我们必须先获取一个class文件。
获取class 文件的方法有很多种:

  1. Class.forName(完整类名);

class clz = Class.forName(com.student.reflect);

  1. 类名.class;

class clz = student.class;

  1. 对象.getClass();

student stu = new student();
class clz = stu.getClass();

调用一个无参的构造器,就相当于实列化

	Class clz = Student.class;
	
		//通过反射的方法调用一个无参的构造器
	Student stu = (Student)clz.newInstance();
	
	
------------------------------------------------//若想调用其他的有参构造器
	Class clz = Student.class;
	
		//通过反射的方法调用一个有两个参数的构造器 getConstructor()方法
		
	Constructor c = clz.getConstructor(String.class, String.class);
	Student stu = (Student) c.newInstance("s001","zs");

调用私有属性

有两个方法:

  1. clz.getDeclaredField(“属性名”);查询单个
	Class clz = Student.class;
		
	
	Constructor c =  clz.getConstructor(String.class);//调用一个参数的构造器
	
	Field declaredField = clz.getDeclaredField("sid");//找到这个属性
	declaredField.setAccessible(true);//设置这个属性可查看
	System.out.println(declaredField.get(c.newInstance("j-01")));

在这里插入图片描述

  1. clz.getDeclaredFields();获取所有
	Student stu = new Student("sj","za");//直接实列化一个
	Class clz = stu.getClass();//获取student的class
	
	Field[] declaredFields = clz.getDeclaredFields();//获取这个类中的所有属性
	for (Field field : declaredFields) {//便利
		field.setAccessible(true);//设置可以查看
		System.out.println(field.getName() +" :"+field.get(stu));
	}

在这里插入图片描述

调用方法

调用方法:clz.getDeclaredMethod(方法名,参数类型);

//	调用hello方法  (无参 ,公开)
	Method m =  clz.getDeclaredMethod("hello"); //找到方法
	Object invoke = m.invoke(clz.newInstance());
	 //m.invoke(clz.newInstance())在哪个类中找 ,为空返回null
		
//	调用hello(String)方法  (有参,公开)
	Method m = clz.getDeclaredMethod("hello",String.class );//找到有参方法
	Object invoke = m.invoke(clz.newInstance(), "zs");
	 //m.invoke(clz.newInstance(), "zs")在哪个类中找,并给其赋值 ,为空返回null
	
//	调用hello(String,String)方法 (有参,私有)
	Method m =  clz.getDeclaredMethod("add", Integer.class,Integer.class);//找到有参方法
	m.setAccessible(true);//可以访问私有方法
	Object invoke = m.invoke(clz.newInstance(), 12,23);
	//m.invoke(clz.newInstance(), 12,23))在哪个类中找,并给其赋值 ,为空返回null
	

student中的方法:
在这里插入图片描述
main方法

在这里插入图片描述

打印:
1
在这里插入图片描述
2
在这里插入图片描述
3
在这里插入图片描述


访问修饰符

其中方法:

**getModifiers()**获取该方法(属性)用的是什么修饰符,返回数字

	Field declaredField = clz.getDeclaredField("sname");
	declaredField.setAccessible(true);
	declaredField.set(stu, "wj");
	System.out.println( "访问修饰符:"+declaredField.getModifiers()+","+declaredField.get(stu));

default 返回0
public 返回 1
private 返回 2
protected 返回 4


总结

这是反射的简单使用的方法,在下章节会仔细讲解反射

Thanks♪(・ω・)ノ希望大家能用来参考

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值