反射很重要,但是我一直不太懂它究竟能干什么,有什么作用,看了一些大佬的文章,稍微有一点点感觉了于是先来记录一下,以后发现错了再回来更改。
反射是什么?
反射是指在运行过程中我们可以获得某个类的全部方法和属性,对于任意一个对象,我们都可以调用它的任意一个方法和属性,这种动态获取信息以及动态调用对象的方法以及属性的功能称为反射。简单理解就是我们平时用开发平台写代码的时候的自动补全以及代码提示功能就是依靠反射来实现的。
我们用的各种开发平台。eclipse,idea等等,都有代码自动提示的功能,这个功能就是基于反射实现的。
先来一个实现了反射的demo:
Class<?> cl1 = Class.forName("java.util.Date");
System.out.println("下面通过反射获取Date类中所有public方法");
Method[] methods = cl1.getMethods();
for(Method i:methods){
System.out.println(i.getName());
}
System.out.println("=================================================================");
System.out.println("下面通过反射获取所有实例方法");
Method[] methods1 = cl1.getDeclaredMethods();
for(Method i : methods1){
System.out.println(i.getName());
}
System.out.println("================================================================");
System.out.println("下面实例化对象,并且输出");
Object obj = cl1.newInstance();
System.out.println(obj);
System.out.println();
上面的代码,我们通过反射获取到了Date类的里面的所有方法,除了方法以外,还有成员变量和构造方法都可以通过这种方式实现。
我们还可以通过反射去调用这些方法
众所周知,当我们需要调用一个类的方法时,我们需要new一个该类的对象,然后通过:object.method()来实现调用该方法。但是有了反射就不需要new对象了。我们可以通过invoke方法实现方法的调用:
首先我们定义一个person类:
class Person{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int add2Num(int a,int b){
return a+b;
}
}
之后我们通过invoke调用:
System.out.println("通过invoke调用get,set方法");
Method setNameMethod = cl2.getMethod("setName", String.class);
Object obj1 = cl2.newInstance();
setNameMethod.invoke(obj1,"yjq");
Method getNameMethod = cl2.getMethod("getName");
Object res = getNameMethod.invoke(obj1);
System.out.println(res);
System.out.println();
System.out.println("通过invoke调用加减函数");
Method getAddMethod = cl2.getMethod("add2Num", int.class, int.class);
Object res1 = getAddMethod.invoke(obj1,1,2);
//下面是格式转换,不重要
String res1String = res1.toString();
int res1Int = Integer.parseInt(res1String);
System.out.println(res1Int+1);
可以看出,我们没有去new一个person对象,而是用一个Object对象和invoke对象调用了person类里面的方法。
正在学习中,还有很多不懂的地方,以后学习深入了再回来补充