反射:当我们new一个对象,需要java虚拟机在我们类加载区域加载这个new的模子,这是虚拟机需要做的事情,有了个这模子就可以new对象,现在用我们使用者来准备个模子,不在用虚拟机而是我们。
相当于一个人通过镜子,看到了自己的鼻子、眼睛,而鼻子、眼睛就是一个个对象。
对java反射理解第一个角色反转了,以前是java虚拟机加载这个模子,现在由我们来运行模子。第二个是将类的各种结构解剖成一个个对象。模子就是class对象。比如我们要造一个山寨iphone手机,首先我们要拿到手机的图纸,这个图纸就是class对象,第一种方法是买一个iphone手机研究它;第二种方法买通iphone手机的设计师拿到这个图纸;第三种方法去偷这个图纸,但是我们要知道这个图纸藏在那儿。
注意推荐第三种方法,因为直接丢字符串,这就可以动态的传进来了。
具体代码
import java.lang.reflect.InvocationTargetException;
/*
*反射:把java类中的各种结构(方法、属性、构造器、类名)映射成一个个的java对象。
*1、获取Class对象
* Class.forName("完整路径")
* 2.动态创建
* clz.getConstructor().newInstance()
*/
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
//一、三种方式
//1、对象.getClass()
IPhone iPhone = new IPhone();
Class clz = iPhone.getClass();
//2、类.class()
clz = IPhone.class;
//3、Class.forName("包名.类名") (推荐)
clz = Class.forName("com.cb.server.basic.IPhone");
//创建对象(java9以下)
/*IPhone iPhone2 = (IPhone)clz.newInstance();
System.out.println(iPhone2);*/
//(java9)推荐
IPhone iPhone2 = (IPhone)clz.getConstructor().newInstance();
System.out.println(iPhone2);
}
}
class IPhone{
public IPhone(){
}
}