Class clz = Class.forName("com.mikechen.reflection.JiaGou");JiaGou jg= (JiaGou)clz.newInstance();
第二种:通过 Constructor 对象的 newInstance() 方法Class clz = Class.forName("com.mikechen.reflection.JiaGou");Constructor constructor = clz.getConstructor();JiaGou jg= (JiaGou)constructor.newInstance();
通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法,下面的代码就调用了一个有参数的构造方法进行了类对象的初始化Class clz = Class.forName("com.mikechen.reflection.JiaGou");Constructor constructor = clz.getConstructor(String.class);JiaGou jg= (JiaGou)constructor.newInstance("mikechen的互联网架构");
接下来我们就可以通过具体的API调用获取到详细的属性或者方法等详细了1、获取类的成员变量的信息//mikechen的互联网架构Field[] fields = cls.getDeclaredFields();
更加详细成员变量获取参考如下:2、获得类方法//mikechen的互联网架构Method[] methods = cls.getDeclaredMethods();
更加详细方法获取参考如下:3、获得构造函数//mikechen的互联网架构 Constructor[] constructors = cls.getDeclaredConstructors();
更加详细构造函数获取参考如下:这样通过反射就可以做在运行时获取类的完整构造,并获得类信息了通过以上一个小案例了解了反射的使用,但如果你想对反射掌握得更好,还需深入理解反射背后的底层实现原理反射工作原理?调用反射的总体流程如下:1、当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件2、这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象3、通过Class对象获取Field/Method/Construcor我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性反射的应用场景举个例子我们的项目底层数据库有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.mikechen.java.myqlConnection,com.mikechen.java.oracleConnection这两个类我们要用这时候我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序,如果是mysql则传入mysql的驱动类,而如果是oracle则传入的参数就变成另一个了Spring 框架的 IOC(动态加载管理 Bean),Spring通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行还有Spring AOP(动态代理)功能都和反射有关系除此之外还有很多框架:mybatis、dubbo、rocketmq等等都会用到反射机制如果不满足于文章详解,私信【架构】获取视频详解(图片来源网络,侵删)
0 评论