java 反射实例化类_java学习笔记之反射—Class类实例化和对象的反射实例化

本文探讨了Java Class类在反射中的核心作用,介绍了三种实例化Class对象的方法:通过实例化对象、JVM直接支持和Class类静态方法。重点讲解了Class.newInstance()的替代方法,并展示了如何通过字符串直接获取类实例。

反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,

可以采用三种方式完成。

java.lang.Class类的定义:

public final class Classextends 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");

完整代码:

packageReflect;public classReflectDemo {public static void main(String[] args) throwsClassNotFoundException {//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类对象*/

packageReflect;public classReflectDemo2 {public static void main(String[] args) throwsException {//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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值