java反射理解

    技术2022-07-11  94

    有误请指正!! 在没有反射的时候

    Fruit obj = getSomeFruit();

    我拿到了这个obj,然后接下来我不知道他的具体类型呀,本人写代码的时候不知道的,我把这个obj当做是一个苹果Apple好了

    接下来 Apple apple = (Apple) obj; apple.eat(); 我就这么写啦,程序不会报错了,编译的时候也不会报错的。因为Apple是fruit的子类没错。

    但是运行的时候报错了!因为要运行的时候才知道这个getObject()方法里面返回给我的橙子Orange。(知识点:编译类型和运行类型)

    这咋办?我想正确吃到苹果,但我又不想在getObject()里面直接new 一个苹果,因为我也想考虑到扩展不想写死代码拿到的一直是水果,如果我以后还想拿其他水果呢?

    这个时候,反射闪亮登场!! 你给我说苹果和香蕉放在哪(也就是类的路径,知道路径之后获取操作类的class对象有三种方法,最常用最安全,性能最好的是Class.forName(“com.whoislcj.reflectdemo.Person”)),我去给你拿。 拿到了你想要的对象之后想知道他们的组成成分(成员变量、方法、构造方法、包)就简单了。 甚至你想知道它的获取泛型类型和注解也可以。 当然,也可以创建对象。通过反射机制创建对象有两种方法(一种是拿到class对象之后调用newInstance()方法,一种是调用拿到class对象调用构造方法getDeclaredConstructor(),然后再调用newInstance()

    简单来说有了反射之后上面的方法可以用反射机制实现,只要输入类的路径getFruit(“类路径”),这个方法里会用放射去找到你说的类用返回给你需要的信息。反射机制无非就是根据一个String来得到你要的实体对象,然后调用它原来的东西

    在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象.反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。很多工厂模式就是使用的反射。

    这个时候再来看看这些难啃的定义:

    JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。 Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。 Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。

    但是我们了解了反射之后,不要一股脑地运用了,反射也有它的优缺点

    实际上自己开发过程中很少用到反射,反射的性能其实比直接的代码慢很多,但是对于框架来说配置文件比源代码好懂,所以框架在做基础框架的时候十分有用,有句话咋说的来着:反射机制是很多Java框架的基石

    在业务代码中唯一合理(直接)使用反射的场景是通过AOP。除此之外,我们最好远离反射这一特性。

    Processed: 0.011, SQL: 9