在之前有写了关于JAVA反射的理解以及几种用法,今天主要想记一下常用一些功能以及一些注意的地方,为了使功能尽量全面,我们以一个包含比较丰富的实体类为例:
首先是新建一个自定义的注解、以及接口:
接下来新建一个Creature类:
接下来新建一个Person类,继承自Creature类,实现上面的自定义接口和一个自带的Comparable接口,以及引用自定义注解:
其中Person类属性有姓名name以及年龄age,分别用不同的访问修饰符:
有参无参构造器使用不同的访问修饰符:
setName方法传入多个变量并有输出语句:
声明一个无返回值和参数的eat()方法:
声明一个带自定义注解并且返回值为String的sleep()方法,并且抛出运行时异常:
再声明两个内部类Computer以及Mobile:
以及重写tostring方法等等,就不一一展示了。
首先来看在运行时创建一个类的实例,首先是创建Class实例,上一次已经说过:
Class<Person> clazz=Person.class;
使用一个带Person泛型的Class类接收,再调用该对象的.newInstance()方法创建一个Person实例:
Person person=clazz.newInstance();
System.out.println(person);
运行结果:
同样我们也可以使用forName()加载全类名创建一个Class实例:
Class<Person> clazz2= (Class<Person>) Class.forName("com.lya.Reflection.Person");
Person person=clazz2.newInstance();
System.out.println(person);
从结果我们不难看出,newInstance()方法默认调用无参构造器。
接下来看在运行时获取类的构造器,注意在上面我们声明Person构造器时,两个有参与无参的构造器访问修饰符不同。
首先同样是获取Class实例:
Class clazz=Person.class;
接下来使用reflect包中的Constructor类,声明一个该类型的数组,调用class实例的getConstructors()方法对所有构造器进行获取:
Constructor[] cons=clazz.getConstructors();
for (int i = 0; i <cons.length ; i++) {
System.out.println(cons[i]);