package study_06;
import java.lang.reflect.InvocationTargetException;
/*
* 三种反射的方式
* 1 获取对象 推荐 第三种Class.forName("包名.类名") 可以降低耦合度
* 2 动态创建对象
*/
public class TestReflect1 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
//获取类
//第一种
Class iphone = new Iphone().getClass();
System.out.println(iphone);
//第二种
Class iphone2 = Iphone.class;
System.out.println(iphone2);
//第三种
Class iphone3 = Class.forName("study_06.Iphone");//Class.forName("包名.类名")
System.out.println(iphone3);
//动态创建对象
//方法1
Iphone obj1 = (Iphone)iphone3.newInstance();//不推荐 jdk8及以下支持
System.out.println(obj1);
//方法2 用构造器 jdk9推荐方法
Iphone obj2 = (Iphone)iphone3.getConstructor().newInstance();
System.out.println(obj2);
}
}
class Iphone{
public Iphone() {}
}
获取类的方法第一和第二个耦合度太高,如果需要获取的类不存在,编译会失败,而第三种这是字符串,不存在编译失败的问题