`
goalietang
  • 浏览: 25290 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈Java的反射(一) 构造方法反射调用

阅读更多
      “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
      以上就是Java反射的一个介绍,很多配置型框架的底层,也都用到了反射的原理来实现动态的加载类,而你只需要配置好相应的类全名。但如何使用java 来实现他的反射呢?
      其实在java中,有三种方法能够获得一个类的字节码:
三种方式加载类获得类的字节码Class clazz
1. Class.forName("classfullnamne");
2. new classname().getClass();
3. calssname.class

      而获得了类的字节码,我们就能够获得这个类的构造函数,方法,成员变量。继而动态的操纵这个类。第一种方法就是用反射的概念来获得了一个类的字节码。
      例如我在配置文件中,找到了一个com.test.User的字符串,我知道这句是我需要动态加载的类全名。我只需要使用Class的一个静态方法: 
Class clazz = Class.forName("com.test.User");

     
      而我们获得了字节码,就可通过下面的代码来获取他的实例:
User user = (User)clazz.newInstance();  (在此我们假设知道实例化的类是个User类而将其强转)

      当然,我们还可以通过以下代码来获取这个类的构造方法:
Constructor con = clazz.getConstructor();  (这个方法没有参数的时候,是调用无参的构造方法。)
Constructor con = clazz.getConstructor(String.class, int.class) (这个方法获得了一个带有两个参数的构造方法,且第一个参数是String类型,第二个参数是int类型的构造方法)

      当获取了构造方法,我们就可以使用获取的构造方法实例化对象了,代码如下:
User user = (User)con.newInstance();  (对,你没有看错,构造方法也有一个叫做newInstance()的方法,用以实例化对象,当前是调用无参的构造方法,实现原理跟之前我们直接用字节码获取他的实例一样。)
User user = (User) con.newInstance("Tang Yu",29);  (对应上面第二个带参数的构造方法,传入相应的两个参数,第一个是String类型,第二个是int类型)

      当然,如果我们的够造方法是私有的,我们就无法通过clazz.getConstructor()这一方法来获取到他了。如果获取对象的私有构造方法呢?众所周知,Java的私有方法只能在对象本身内部调用,但是java通过反射也给我们留了一个后门,让我们在外部也能调用他的私有方法,包括私有构造方法。这就是暴力反射,这时候,首先在我们获得我们需要写以下代码:
Constructor c = clazz.getDeclaredConstructor(); (大家注意,不是之前那个获得构造函数的方法了。)
c.setAccessible(true);  (使用这句代码,使进入该私有构造方法可能。切记,如果没有这句代码,会报错,说无法在外部访问private的方法)

      获得了构造方法,并且也设置了他的访问权限公开,之后的就能正常调用该方法了。
      至此,我们使用反射的原理,动态的调用类的构造方法并产生实例就实现了。
      下节我将研究如何使用反射动态的调用该类中的普通方法。
分享到:
评论

相关推荐

    浅谈Java程序中的构造方法调用.pdf

    浅谈Java程序中的构造方法调用.pdf

    Java常用的反射方法

    代码中包含的方法有如下 : 1....4. 反射获取构造方法 4.1有参构造 4.2无参构造 4.3无参构造简便写法 5.反射获取成员方法 5.1无参方法 5.2 有参方法 5.3 获取所有方法(包含Object的方法)

    83.java中String构造方法.zip

    83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...

    85.java中String构造方法.zip

    85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中...

    Java的子类调用父类的构造方法.pdf

    Java的子类调用父类的构造方法.pdf

    java构造方法

    构造方法 解析 深度测试java的 构造方法

    浅谈Java中单例设计模式之构造方法私有化.pdf

    浅谈Java中单例设计模式之构造方法私有化.pdf

    JAVA反射机制详解视频

    (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) (通过反射获取带参带返回值成员...

    java 构造方法的资源

    java 构造方法 java 构造方法 java 构造方法

    java反射知识点

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我的代码里主要有一下知识点: 1.获取Class对象的三种方式 2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射...

    java反射调用实例代码

    该资源包含了一个利用反射执行的一些操作,包含了动态执行构造方法,动态运行私有方法,为属性初始化等等,简单易懂。

    79.java构造方法.zip

    79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java构造方法.zip79.java...

    Java继承时构造函数的调用

    Java继承时构造函数的调用, java面向对象特征: 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。

    java 构造方法PPT

    关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT 关于构造方法的PPT ...

    候捷谈Java反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    java 构造器的调用

    java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用

    java构造方法学习案例

    java构造方法的学习对java学习者尤为重要

    java中的反射(详解)

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java...

    构造方法JAVA构造方法

    关于JAVA的构造方法,有一些练习的东西!

Global site tag (gtag.js) - Google Analytics