使用java 的spring框架我们不再需要使用new对象,而是通过
来获取对象。
今天笔者了解了下java的反射,对spring的有了一个全新的认识。
先来说下反射的核心思想
将一个类的各个成员映射成相应的Java类型
例如图中的成员有 包 构造器 属性字段 普通方法 而反射即是把需要的转化成相应的java类型 。可以依靠反射来换取相应的成员,下面的例子通过反射来创建一个对象。
创建了一个很基础的类
public class father {
public String fathername="fathername";
public father() {
}
public father(String fathername) {
this.fathername = fathername;
}
public void father() {
System.out.print("father");
}
}
1.正常的创建对象
public class main {
public static void main(String[] args) {
father father=new father();
System.out.print(father.fathername);
}
}
这种方法相信应该所有人都看的懂,就是依靠new来创建对象
测试,返回结果
fathername
2.通过反射来创建对象(不使用spring框架的bean)
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class getclass = Class.forName("全类名");//不能写class //1
Constructor constructor=getclass.getConstructor(); //2
//Constructor constructor=getclass.getConstructor(String.class);
father father=(father)constructor.newInstance(); //3
father father=(father)constructor.newInstance("name");
System.out.print(fahter.fathername); //4
}
这里来详细的解释下
我们都知道,java依靠JVM解析java类文件是先将.java转化为.class ,而这里的.class就是字节码文件。(如果对字节码是什么不了解,请先百度一下)
1.代码中的第一行(标注1的地方)即是获取字节码文件。获取字节码文件的方法有很多种,可以自行百度下,这里使用Class.forName() (注意获取字节码的时的class和Class,不要掉坑里了)
2.代码种第二行(标注2的地方) 我们都知道java创建对象是依靠构造器的,这种依靠反射的创建对象也不例外,代码第二行即是获取构造器的字节码
,当然例子中的father有无参和有参的,无参即是.getConstructor();,有参即
.getConstructor(String.class);
3.代码第三行即是利用constructor最后的创建对象
4.测试,返回结果
fathername
与用new创建的对象返回结果一致