反射【一】

前言

|ू・ω・` )
在进行可以通过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♪(・ω・)ノ希望大家能用来参考

展开阅读全文

没有更多推荐了,返回首页