什么是反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
什么是类的类对象:
在面向对象的世界里,万物皆对象。类也是对象,它是java.lang.Class类的实例对象。我们可以通过反射拿到所有类的类对象。通过这个类的类对象我们可以获取这个类的所有信息。
什么静态加载和动态加载
我们知道程序是运行在虚拟机当中,我们.java文件会编译后变成.class文件存放在虚拟机的堆中,而我们的程序是运行在内存当中,静态加载是指在编译时期就必须确定程序需要的所有类的信息,像new User()就是静态加载,如果User这个对象不存在则编译肯定不会通过。(因为User.java根本不存在,编译后虚拟机当中肯定没有它的class文件,而静态加载就是在编译时期就要将所有需要使用到的类的信息都放到内存中,即它要拿到类的所有信息)
而反射属于动态加载,在运行时刻才会确定类的信息
验证:
interface Fruit {
void getName();
}
public class Orange implements Fruit{
@Override
public void getName() {
System.out.println("我是橙子");
}
}
public class Apple implements Fruit{
@Override
public void getName() {
System.out.println("我是苹果");
}
}
Apple apple = (Apple) Class.forName("com.example.reflectionapplication.Orange").newInstance();
apple.getName();
正常我们
Apple apple = new Orange()
编译时就会报异常。如上通过反射创建Orange对象赋值给Apple对象,编译可以通过,运行时就才抛异常了。因此证明了反射是动态加载。
**反射我们可以用在哪里
继续引用上面的例子,我们使用简单工厂模式和工厂模式来创建对象
简单工厂模式