Java中反射学习系列教程三-常用API方法
- 作者:
凯哥Java(公众号:凯哥Java)
-
反射
- 时间:2019-06-24 22:20
- 7795人已阅读
简介
本文是《Java中反射学习系列教程》中的第三篇文章。本文我们接着之前的讲解。先来看看今天学习主要内容:4.2.2 实例化class对象的几种方式Class对象获取共有三种方式。如下:Demo演示获取Class对象三种方法/***2:class对象的几种获取方式*/@Testpublicvoid getClassTest() throws Exception{
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
微信号 kaigejava2022
本文是《Java中反射学习系列教程》中的第三篇文章。本文我们接着之前的讲解。
先来看看今天学习主要内容:

4.2.2 实例化class对象的几种方式
Class对象获取共有三种方式。如下:

Demo演示获取Class对象三种方法
/** * 2:class对象的几种获取方式 */ @Test public void getClassTest() throws Exception{ //1:class.fromName获取 Class<?> clazz1 = null; clazz1 = Class.forName("com.kaigejava.domain.Person");
//2:通过new关键之创建的类调用其getClass方法 Class<?> clazz2 = null; clazz2 = new Person().getClass();
//3:直接对象调用class方法 Class<?> clazz3 = null; clazz3 = Person.class; log.info("clazz1 name:{}",clazz1.getName()); log.info("clazz2 name:{}",clazz2.getName()); log.info("clazz3 name:{}",clazz3.getName()); }
|

输出结果:

4.2.3 获取对象的父类和接口

Demo示例代码:
/** * 3:获取父类和接口对象 */ @Test public void supperAndInterfaceTest() throws Exception{ //1:获取父类对象 Class<?> clazz1 = Class.forName("com.kaigejava.domain.Student"); Class<?> studentParentName = clazz1.getSuperclass(); System.out.println("student parentName为:"+studentParentName); //2:获取接口对象 Class<?> clazz2 = Class.forName("com.kaigejava.service.impl.StudentServiceImpl"); Class<?> interfaceNames[] = clazz2.getInterfaces(); for (int i = 0; i < interfaceNames.length; i++) { System.out.println((i + 1) + ":" + interfaceNames[i].getName()); }
}
|

运行后结果:

4.2.3.1 为什么说JAVA是单继承多实现的?
注:为什么获取父类的时候使用的是class单个对象接收?而获取接口的时候使用的是class数组接收?
从这里也就解释了为什么Java是单继承多实现了。
4.2.4 获取对象的构造器对象
构造器在java中使用Constuctor对象表示的。我们知道构造器分为无参构造和有参构造。
获取构造器对象使用API中的两个方法如下:

其中:
getConstructor(Class<?>…parameterTypes):获取到的是有参构造器
getConstructors():获取得是所有构造器
Demo示例代码:
/** * 4:获取构造器对象 */ @Test public void getConstructorTest() throws Exception{ Class<?> clazz1 = Class.forName("com.kaigejava.domain.Student"); //1:获取所有的 Constructor<?>[] defaultConstructors = clazz1.getConstructors(); //循环得到每个构造器需要的参数 for (int x = 0 ;x <defaultConstructors.length;x++){ Constructor constructor = defaultConstructors[x]; //获取构造器的参数 Class<?> [] paramTypes = constructor.getParameterTypes(); log.info("获取到第:{}个构造器。",x); for (int y = 0; y < paramTypes.length; y++){ if(y != paramTypes.length-1){ log.info("其中第:{}个参数为:{}",y,paramTypes[y].getName()); }else{ log.info("其中第:{}个参数为:{}",y,paramTypes[y].getName()+","); } } } //2:获取有参构造器 Class[] paramArr = new Class[]{String.class}; Constructor<?> paramConstructor = clazz1.getConstructor(paramArr); Student student = (Student)paramConstructor.newInstance("北京大学附属中学"); log.info("使用有参构造器实例化的对象:{}",student.toString());
}
|

运行结果:

说明:class.newInstance()获取对象实例。在后将讲解到.
总结:

4.2.5 获取实例对象
通过class获取对象使用到的API方法是:

Demo示例代码:
/** * 5:获取实例对象 */ @Test public void createNewObjeTest() throws Exception{ Class<?> clazz1 = Class.forName("com.kaigejava.domain.Student"); Student student = (Student)clazz1.newInstance(); student.setAge(25); student.setName("凯哥Java"); student.setSchoolName("北京大学附属中学"); log.info("通过反射得到是student:{}",student.toString()); }
|

运行结果:

今日总结:

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2rmef7i1tse80