反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,
可以采用三种方式完成。
java.lang.Class类的定义:
public final class Class
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement, TypeDescriptor.OfField>, Constable
1.Object类支持:
Object类可以根据实例化对象获取Class对象:public final Class> getClass()
这种方式有一个缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得,会造成一个无用的对象产生
代码:
Person per = new Person();//已经存在有指定类的实例化对象
Class extends Person> cls = per.getClass();
2.JVM直接支持:
采用“类.class”的形式实例化
代码:
Class extends Person> cls2 = Person.class;
3.Class类支持:
在Class类里面提供有一个static方法:
加载类:public static Class> forName(String className) throws ClassNotFoundException
这种模式最大的特点是可以直接采用字符串的形式定义要使用的类型,并且程序不需要编写任何的import程序
注意:使用该方法时参数必须是完整类名,如以下代码中IOtest为包名,InputUtil是类名
Class> cls3 = Class.forName("IOtest.InputUtil");
完整代码:
package Reflect;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
// 1、Object类支持
Person per = new Person();//已经存在有指定类的实例化对象
Class extends Person> cls = per.getClass();
System.out.println(per);
System.out.println(cls.getName());//获取的是类的完整名称
// 2、JVM直接支持
Class extends Person> cls2 = Person.class;
System.out.println(cls2.getName());
// 3、Class类支持
Class> cls3 = Class.forName("IOtest.InputUtil");//不需要用import导入IOtest包
System.out.println(cls3.getName());
}
}
class Person{}
获取Class对象之后最大的意义实际上并不是在于这是一个对象,更重要的是Class类里面提供有一个对象的
反射实例化方法(代替了关键字new):
在jdk1.9以前的实例化:public T newInstance() throws InstantiationException,IllegalAccessException
jdk1.9之后:clazz.getDeclaredConstructor().newInstance()
通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类()”,也就是说相当于隐藏了关键
字new,而直接使用字符串进行了替代
代码实例:
/*
* 通过newInstance()方法实例化Student类对象
*/
package Reflect;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class> cls = Class.forName("mldn.Student");
Object obj = cls.newInstance();//实例化对象,jdk1.9后被废除
System.out.println(obj);
//jdk1.9之后:被clazz.getDeclaredConstructor().newInstance()替代
Object o = cls.getDeclaredConstructor().newInstance();
System.out.println(o);
}
}