1.反射的定义
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java反射机制主要提供了以下功能
2.反射的优缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念。程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,相对的就是静态语言。
优点
增加程序的灵活性,避免将程序写死到代码里。反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中 灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把设计的很完美,当这个程序编 译后,发布了,当发现需要更新某些功能时,不可能要用户把以前的卸载,再重新安装新的版本。
缺点
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。
3.反射的相关操作
Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的Field、Constructor、Method、Array类。
注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息。
那么反射能够用来做什么呢?
3.1获取成员方法Method
api
// 得到该类所有的方法,不包括父类的
public Method getDeclaredMethod(String name, Class<?>... parameterTypes);
// 得到该类所有的public方法,包括父类的
public Method getMethod(String name, Class<?>... parameterTypes);
示例
//输出类的public方法
Method[] methods = exampleObjectClass.getMethods();
for (Method method : methods){
System.out.println("method = "+ method.getName());
}
3.2获取成员变量Field
api
// 获得该类自身声明的所有变量,不包括其父类的变量
public Field getDeclaredField(String name);
// 获得该类自所有的public成员变量,包括其父类变量
public Field getField(String name);
示例
Field field = exampleObjectClass.getField("age");
System.out.println("变量为:" + field.toString());
3.3获取构造函数Constructor
api
// 获得该类所有的构造器,不包括其父类的构造器
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
// 获得该类所以public构造器,包括父类
public Constructor<T> getConstructor(Class<?>... parameterTypes);
示例
Constructor constructor = exampleObjectClass.getConstructor(String.class);
System.out.println(constructor.toString());
到此,反射机制的基本知识就差不多了,后续学习springmvc时,spring的控制反转和依赖注入就是用反射机制实现的。
最后,如果你有仍何开发上面的问题都可以和我交流沟通。