本文是《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
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());
}
运行结果:
今日总结:
本文来源:http://www.kaigejava.com/article/detail/450
凯哥博客:www.kaigejava.com
凯哥公众号:凯哥Java