new与newInstance()的区别
Class cla=Class.forName(“java.lang.String”);//初始化
Object obj=cla.newInstance();//实例化为object类
String str=(String)obj;//向下转换回子类
Class.forName会导致类被初始化,newInstance()才会实例化;
而new()初始化+实例化
相比较,new的语句简单,可以在创建时加入参数调用构造函数,而newInstance()把创建对象步骤分开,使得更灵活
T,Class,Class<?>区别
-
调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。
List list = null;
Class clazz = list.getClass(); -
使用Class类的中静态forName()方法获得与字符串对应的Class对象。
Class clazz = Class.forName(“com.lyang.demo.fanxing.People”); -
获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。
Class clazz = List.class;
那么问题来了?Class类是创建出来了,但是Class和Class<?>适用于什么时候呢?
People people = (People) Class.forName(“com.lyang.demo.fanxing.People”).newInstance();
看到了么,需要强转,如果反射的类型不是People类,就会报
java.lang.ClassCastException错误。
使用Class泛型后,不用强转了
public class Test {
public static <T> T createInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
return clazz.newInstance();
}
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Fruit fruit= createInstance(Fruit .class);
People people= createInstance(People.class);
}
}
那Class和Class<?>有什么区别呢?
Class在实例化的时候,T要替换成具体类
Class<?>它是个通配泛型,?可以代表任何类型,主要用于声明时的限制作况
例如可以声明一个:public Class<?> clazz;
但是你不能声明一个:public Class clazz;
不知道定声明什么类型的Class的时候可以定义一个Class<?>,Class<?>可以用于参数类型定义,方法返回值定义等。