什么是反射
反射是用来获取指定Class文件中的属性及方法的
反射的重要性:在我们后面的框架写工程的情况下,我们拿到的都是第三方的Jar包,我们不直到里面都有哪些属性和方法,所以就需要我们的反射,把里面的属性和方法反射出来供我们使用
所有的Class文件也是类型,是个Class类
反射怎么使用
我们能获取到该类中私有的,或者是所有的包括私有公共的的方法,属性和构造器,我们来看一下代码
public static void reflexMethod03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//这个里面穿的路径是重点
Class itemCls=Class.forName("cn.yunhe.twoday.beans.Item");
//获取所有的公共的构造器
//Constructor[] constructors=itemCls.getConstructors();
//获取所有的构造器包括私有的
Constructor[] cons= itemCls.getDeclaredConstructors();
// System.out.println(cons);
// for(int i=0;i<cons.length;i++) {
// //cons[i].getParameterCount() 获取到构造器的参数有几个,打印出来
// System.out.println(cons[i]+""+cons[i].getParameterCount());
// if(cons[i].getParameterCount()==2) {
// //要创建带有参数的具体参数的对象
// Item item=(Item)cons[i].newInstance("phone",4999);
// System.out.println(item);
// }
// }
/**
*另外一种写法,直接捕获掉,如果这个类里面有这个构造方法,就可以直接创建
*对象去写,如果没有的话就提示这个类里面没有这个构造器
*在itemCls.getConstructor(String.class,int.class)这里面直接写数据类型.class如果没有这个类型的构造器
*直接走catch里面,没有该类型的构造器
*/
try {
Constructor constructor=itemCls.getConstructor(String.class,int.class);
Item item=(Item)constructor.newInstance("phone",50000);
System.out.println(item);
} catch (NoSuchMethodException | SecurityException e) {
System.out.println("没有该类型的构造器");
}
}
这个里面呢,是我们获取到另外一个class类中的公共的构造器的方法和获取所有的(包括私有的)构造器的方法,都可以获取到,后面的那一个捕获异常的代码块呢,是我们获取一个指定的构造器,这个只是我们用来演示,如果有的话我们可以再这个指定的构造器里面写入我们的值,如果没有这个构造器,我们就输出一个没有这个类型的构造器,那么我们就可以去找有的构造器了。
我们在使用的时候是需要去创建具体对象,我们就需要去指定一个具体的构造器,需要指定构造器参数的类型是什么,itemCls.getConstructor(String.class,int.class)在这个里面指定我要用到的构造器对应的参数的类型是什么,在这个使用的过程当中,可能会出现这个构造器就不存在,如果存在,返回构造器的对象,构造器的对象当中呢,给提供了一个创建对象的方法newInstance(“phone”,50000);
/**
* 获取方法
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static void method() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
Class itmeClS=Class.forName("cn.yunhe.twoday.beans.Item");
//获取所有的公共的方法
// Method[] me=itmeClS.getMethods();
//获取所有的方法包括私有的
Method[] me1=itmeClS.getDeclaredMethods();
// for(int i=0;i<me1.length;i++) {
// System.out.println(me1[i]);
// }
for(Method method:me1) {
System.out.println(method);
}
//参数一:方法名 参数二:参数类型
Method me2=itmeClS.getMethod("setItemName", String.class);
System.out.println(me2);
}
这个是我们获取的所有公共的方法和所有的方法的方法,后面也有一个我们获取指定构造器的方法
public static void getProperty() throws ClassNotFoundException {
Class propertycls=Class.forName("cn.yunhe.twoday.beans.Item");
//获取公共的属性
Field[] filed=propertycls.getFields();
for(Field fl:filed) {
System.out.println(fl);
}
//获取所有的属性
// Field[] filed=propertycls.getDeclaredFields();
// for(Field fl:filed) {
// System.out.println(fl);
// }
}
这个里面是我们获取所有的属性和获取公共的属性的方法, 里面注释的是我们一个简易for循环来获取所有属性的一个写法, 我们可以用简易for循环把里面的所有属性都循环出来,而这个简易for循环对比普通的for循环来说,就是节省了代码,我们一般反射的话用简易的for循环就可以了
总结:
所有的Class类中的方法:
加Declared的都是能搜索所有本类的公共的私有的保护的默认的方法和属性和构造器
不加Declared的就只能搜索父类和本类中公共的私有的保护的默认的方法和属性和构造器
方法后面加S的都是搜索全部的,不加S的就是指定返回某一个指定对象。