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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359

推荐阅读更多精彩内容

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