1.反射编程概述
java反射机制是指在程序运行时动态调用对象方法、访问对象属性的功能。使用反射会在很大程度上提高代码的灵活性,但是通过反射创建对象时性能要稍微低一些,在实际开发中,没有必要使用反射来访问已知类的方法和属性,只有当程序要动态创建某个类的对象的时候才会考虑使用。例如,从配置文件中读取以字符串形式表示的类时,就必须使用反射来获取它的方法和属性。
java反射编程时在编译时并不确定是哪个类被加载了,只有"运行以后"这个类才被加载、感知和使用。而非反射编程,代码编译之后,就可以确定是哪个java类了,程序启动之后代码运行之前,java类就已经被jvm加载了。
java反射机制能够知道类的基本结构,这种对java类结构探知的能力,称为java类的自审。Eclipse等IDE中代码的自动提示功能,就是利用了java反射的原理,是对所创建对象的探知和自审。
【java反射可以实现的功能】:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的方法和属性
在运行时调用任意一个对象的方法
【java反射常用API】
Class类、Field类、Method类、Constructor类
【使用反射的基本步骤】
导入java.lang.reflect.*
获得目标类的java.lang.Class对象
调用Class的方法获取Field、Method等类的对象
使用反射API进行操作
2.反射创建各种对象
3.Field对象的使用
4.Method对象的使用
5.类信息的获取
//1.创建类对应的Class对象
Class cla=Student.class;
//2.获取此类的包的Package对象
Package pe=cla.getPackage();
//2.1包名
System.out.println(pe.getName());
//2.2package 包名
System.out.println(pe.toString());
//3.1获取此类的类名全路径:包名.类名
System.out.println(cla.getName());
//3.2获取此类的类名简称:类名
System.out.println(cla.getSimpleName());
//4.获取类的父类对应的Class对象
Class superClass=cla.getSuperclass();
//4.1父类的类名全路径
System.out.println(superClass.getName());
//5.获取类实现的全部接口的Class对象
Class[]allInterface=cla.getInterfaces();
//5.1打印所有接口名
for (Class class1 : allInterface) {
System.out.println(class1.getName());
}
6.数组的反射编程
/**
* 使用java.lang.reflect.Array类动态创建和访问数组
* Array类的对象可以代表所有的数组
*/
public static void main(String[] args) {
//1.动态创建一个数组
//使用Array的newInstance(数组元素类型.class, 数组长度)方法
//返回一个Object对象
Object arr=Array.newInstance(String.class, 10);
//2.为数组元素赋值
//使用Array的set(Object array, int index, Object value)方法
//为某个下标赋值
Array.set(arr, 4, "d4");
Array.set(arr, 5, "e5");
//3.取出数组元素的值
//使用Array的get(Object array, int index)方法
//取出某个下标的值,返回Object对象
String s4=(String) Array.get(arr,4);
String s5=(String) Array.get(arr,5);
System.out.println(s4+" "+s5);
}