反射

摘自:https://www.liaoxuefeng.com/wiki/1252599548343744/1264804593397984

Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息

反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法

Class类

除了int等基本类型外,java的其他类型全部都是class(包括interface),如String、Object、Runnable、Exception

class(包括interface)的本质是数据类型(Type),无继承关系的数据类型无法赋值

动态加载 

JVM在执行Java程序的时候,并不是一次性把所有用到的class全部加载到内存,而是第一次需要用到class时才加载

如果没有用到某个方法,那么这个方法对应的class文件根本就不会被加载,这就是JVM动态加载class的特性

动态加载class的特性对于Java程序非常重要。利用JVM动态加载class的特性,我们才能在运行期根据条件加载不同的实现类

JVM为每个加载的classinterface创建了对应的Class实例来保存classinterface的所有信息;

获取一个class对应的Class实例后,就可以获取该class的所有信息;

通过Class实例获取class信息的方法称为反射(Reflection);

JVM总是动态加载class,可以在运行期根据条件来控制加载class。

 获取继承关系

动态代理

有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?

这是可能的,因为Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。

动态代码,我们仍然先定义了接口Hello,但是我们并不去编写实现类,而是直接通过JDK提供的一个Proxy.newProxyInstance()创建了一个Hello接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式,我们称为动态代码。JDK提供的动态创建接口对象的方式,就叫动态代理。

原文地址:https://www.cnblogs.com/liushoudong/p/12601351.html