前言
|ू・ω・` )
在进行可以通过XML文件解析后,可以获取到指定的路径,
在获取到路径后,我们可以干一些什么了。
- 可以通过路径实列一个class文件。
我们可以用class文件可以实列化对象,查看读写属性,调用方法
初识反射
反射的概念
反射:反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
如图:
优点:
- 反射提高了程序的灵活性和扩展性。
- 降低耦合性,提高自适应能力。
- 它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
-
性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
-
使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
反射的使用:实例化对象,查看读写属性,调用方法
实列化对象
首先要实列化对象,我们必须先获取一个class文件。
获取class 文件的方法有很多种:
- Class.forName(完整类名);
class clz = Class.forName(com.student.reflect);
- 类名.class;
class clz = student.class;
- 对象.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");
调用私有属性
有两个方法:
- 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")));
- 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♪(・ω・)ノ希望大家能用来参考