Java中反射学习系列教程三-常用API方法

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

本文是《Java中反射学习系列教程》中的第三篇文章。本文我们接着之前的讲解。

先来看看今天学习主要内容:

39083750bf102764b55e97e66ac35051.png


4.2.2 实例化class对象的几种方式

Class对象获取共有三种方式。如下:

Demo演示获取Class对象三种方法

/**
* 2class对象的几种获取方式
*/
@Test
public void getClassTest() throws  Exception{
   //1class.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 = 0i < interfaceNames.lengthi++) {
       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 = ;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());
}


运行结果:

今日总结:

5d9915492c4d554f6b6ec890a7e23e80.png


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

Top Top