反射的机制:
传统调用对象的方法,采用new方法将对象实例化,用对象实例化进行调用:
package org.example; public class Main { public static void main(String[] args) { //传统调用对象的方法,采用new一个对象实例化,然后调用其方法 //下面是传统方法的例子 Cat cat=new Cat(); cat.method(); } }
package org.example; public class Cat { public void method(){ System.out.println("猫吃鱼"); } }
虽然简洁明了方便,但是不满足设计模式23项原则中的开闭原则(不修改原代码的基础上扩展功能)
体现了反射的重要性
反射的作用:
反射通过配置文件来达到不需要修改原代码的基础上,扩展功能,具体表现为对于任何一个类,都可以获得这个类的属性和方法,对于给定的一个对象,都能调用它的任意一个属性和方法,动态的获取类的内容以及动态的调用对象的方法,称之为反射机制
下面是一个简单的例子:
package org.example; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Properties; public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { //通过properties类可以读取配置文件的内容 Properties properties=new Properties(); //将需要读取的文件以文件流方式传入 properties.load(Files.newInputStream(Paths.get("src\\main\\resources\\re.properties"))); //获取相应的类 String classPath=properties.get("classPath").toString(); //获取相应的对象名 String methodName=properties.get("method").toString(); //使用反射机制解决 //第一步加载一个类 Class<?> aClass = Class.forName(classPath); //类实列化 Object o = aClass.newInstance(); //在反射机制中一切皆对象,通过class加载一个方法对象 Method method1 = aClass.getMethod(methodName); //通过方法对象实现调用方法 method1.invoke(o);//传统中是对象.方法,在反射机制中,方法.invoke(对象) } }
在此实例中如果想对cat类进行更新迭代,产生其他的方法运用在这里,只需要将cat继承,实现想要的功能,然后更改配置文件的路径,符合设计模式的开闭原则
反射原理:
1.反射机制允许程序在执行期借助于reflection Api取得任何类的内部信息(比如成员变量,成员方法,构造器等等),并能操作对象的属性及方法,反射在设计模式的底层框架都会用到
2.加载完类之后,在堆中产生了一个class类型的对象(一个类只有一个class对象),这个对象包含了类的完整结构信息。
编译阶段在java的jvm机制中操作
反射相关类:
class (class代表一个类,class对象表示某个类加载后在堆中的对象) field (表示类的成员变量) method(表示类的成员方法) constructor(代表类的构造器)
反射的优缺点:
优点:可以动态的创建和使用对象(也是框架底层的核心),使用灵活,没有反射机制,框架技术就失去底层支撑
缺点:使用反射的基本是解释执行,对执行速度有影响。
使用反射的耗时:
使用new创建对象的耗时:
由此可见反射的性能更低
反射调优:
1.Method和Field、Constructor对象都有setAccessible0方法
2.setAccessible作用是启动和禁用访问安全检查的开关
3.参数值为tue表示反射的对象在使用时取消访问检查,
提高反射的效率。参数值为false则表示反射的对象执行访问检查将反射的访问检测关闭,可以适当的优化:
没优化的耗时:
优化的耗时: