java反射之构造器

image.png

清晨阳光正好,独自一人漫步于山间中,这里少了嘈杂的喧闹声,多了份安宁祥和,有的是溪水的咚咚声,小鸟的欢快声,迎面走去,微风吹来夹杂了泥土的味道和扑鼻的花香味,感受到了大自然的......在这里祝各位老铁五一节玩的开心,此生有机会欢迎来我们大西北,感受不一样的人情风土,体验真正人生百态,可以了,我们今天来了解反射里如何获取一个类的构造器和创建对象。

如何获取构造器
  > 要获取构造器我们还需用到上节所讲的class类,所以我们通过class类来获取构造器。
  1. public Constructor<?>[]getConstructors();该方法只能获取Class所表示类的public修饰的构造器。
 2. public Constructor<?>[]getDeclaredConstructors()  
 获取当前class所表示类的所有构造器,和访问权限无关。
 3.publicConstructor<T>getConstructor(Class<?>...parameterTypes);
   获取当前class所表示类的指定的public修饰的构造器。
   其中 参数parameterTypes表示:构造器参数的类型如:
   public User(String name)
  4.publicConstructor<T>getDeclaredConstructor(Class<?>...ParameterTypes);
   获取当前class所表示类的指定的一个构造器,与访问权限无关。接下来我们分别来看。

为了获取构造器,我在这里创建了一个User类。

代码如下:

class User {

public User() {

}

public User(String name) {

}

private User(String name, int age) {


}

从这里看到,创建三个构造方法,公共的无参和有参,以及私有的有参。

方式一:

定义一个获取所有的构造器方法
private static void getAll() {
获取User类的字节码
Class<User> clazz = User.class;
返回的公共类型的构造方法
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> con : constructors) {
System.out.println(con);

    }

    System.out.println("======================================");

    返回所有的构造器,与访问权限无关
    Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
    for (Constructor<?> cons : declaredConstructors) {

      System.out.println(cons);
    }
}

上面的方法返回的都是所有的构造器,我们通过遍历并打印出了结果:

打印结果如下:
QQ截图20180501230210.png

上图是我们打印的结果,我们拿到了该类的所有构造器,接下来我们看如何获取单个构造器。

方式二:

我在这里定义了一个名叫getOne()的方法:

代码示例:

private static void getOne() throws Exception{

    获取构造器所在类的的字节码对象
    Class<User> clazz = User.class;
    获取无参构造器
    Constructor<User> con = clazz.getConstructor();
    System.out.println(con);
 
    System.out.println("===================");
    获取公共方法有参构造器
    Constructor<User> constructor = clazz.getConstructor(String.class);
    System.out.println(constructor);

    System.out.println("----------------------------------------");
    获取私有构造器
    Constructor<User> de = clazz.getDeclaredConstructor(String.class, int.class);
    System.out.println(de);
}
打印结果如下:
QQ截图20180501234653.png

从上述打印结果来看,我们拿到了该类的所有构造器。
讲完了如何获取一个类的构造器,接下来我们来看看如何
创建对象,都知道构造器的最大作用就是用来创建对象,这是我们后面框架中的东西,不在new对象,而是通过反射来创建对象,因为在框架中给我们提供的都是字符串。

利用反射来创建对象:
      > 具体的每一步如下:
        1.首先还是要找到构造器所在类的字节码对象
        2.获取构造器
        3.使用反射创建对象
代码示例如下:

我在这里创建了一个Student类

class Student{

public Student(){

    System.out.println("无参构造器");
}
public Student(String name) {
    System.out.println("有参构造器"+name);
}
private Student(String name,int age) {

    System.out.println("有参构造器"+name+","+age);
}

以下用来如何创建对象:
public static void main(String[] args)throws Exception {

     普通的创建对象
    /*new Student();*/
      通过构造器来创建对象
    1.首先来获取构造器对象的字节码对象
    Class<Student> clazz = Student.class;
    2.调用无参构造器
    Constructor<Student> con = clazz.getConstructor();
    3.调用newInstance方法来创建
     con.newInstance();
    System.out.println("=============================");
    调用公共有参构造器
    con = clazz.getConstructor(String.class);
    con.newInstance("哈哈");
    System.out.println("===============================");
    调用私有构造器
    con = clazz.getDeclaredConstructor(String.class,int.class);
    设置允许访问私有构造器
    con.setAccessible(true);
    调用newInstance方法
    con.newInstance("啦啦",17);

}

注意:在调用私有的无参构造器时,首先要设置允许此操作,如con.setAccessible(true);设置为true,如不设置,会报java.lang.IllegalAccessException非法的访问异常,所以要注意这一点。

打印结果如下:
QQ截图20180502000911.png

以上截图就是打印的结果,关于利用反射拿到构造器和创建对象我们说到这里,最后一句衷心得问候,老铁们晚安!!!!,欢迎骚扰。假期愉快的结束了,该继续打鱼升级了........

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、概述 Java反射机制定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法...
    CoderZS阅读 1,659评论 0 26
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数、...
    Ten_Minutes阅读 560评论 0 4
  • 经常混迹于各种社交网络的你,一定也看了这个前段时间被各种安利的超级励志的视频。 就是下面这个,日剧《女王的教师》中...
    电影天堂阅读 1,419评论 1 6
  • 我怀着激动的心情从书包拿出这本书~犄角镇奇幻事件录,封面画吸引着我对她的兴趣,不由得让我想慢慢的了解她。 我慢慢翻...
    杨邹君阅读 450评论 0 0