“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,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反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于获取类的方法、字段、构造器等,并能动态调用方法和修改字段值。这个特性使得Java具有了更...
Java 程序中的构造方法调用 Java 程序设计语言中的构造方法是一个特殊的成员方法,它专门用于创建对象和对所创建的对象进行初始化。正确调用构造方法是我们设计程序的关键所在。构造方法的调用方式有三种:一是在...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。
在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的动态性至关重要。 首先,我们需要了解`java.lang.Class`类,它是Java中所有类的通用表示。当我们知道一个类的名字...
本篇文章将深入探讨如何在NDK环境中调用Java的构造方法、父类方法以及处理Java返回的中文字符串可能出现的乱码问题。 首先,让我们了解一下在C/C++中调用Java的方法。这主要依赖于JNI(Java Native Interface)。...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
代码中包含的方法有如下 : 1....4. 反射获取构造方法 4.1有参构造 4.2无参构造 4.3无参构造简便写法 5.反射获取成员方法 5.1无参方法 5.2 有参方法 5.3 获取所有方法(包含Object的方法)
Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...
在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。本文将深入探讨Java反射的相关知识点。 1. 常用`Class`类方法: - `Class.forName(String ...
"浅谈Java中单例设计模式之构造方法私有化" 单例设计模式是 Java 中一种常用的设计模式,核心思想是将类的构造方法私有化,以控制实例化对象的产生。这种模式可以确保在程序中只有一个实例化对象存在,这对控制对象...
在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类信息等。本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解...
反射允许Java程序加载运行时才知道名称的类,了解其构造,创建类的对象,设置字段值,或者调用方法。 Java反射的核心在于`java.lang.Class`类,以及`java.lang.reflect`包中的`Method`、`Field`和`Constructor`等类...
当一个类被实例化时,Java会自动调用该类的构造方法来完成初始化工作。 二、构造方法的声明 构造方法的声明格式如下: ```java public ClassName(parameters) { // 初始化代码 } ``` 这里的`ClassName`是类的名称...
Java的子类调用父类的构造方法.pdf
为了准确评估Java反射的性能,我们设计了一系列基准测试,涵盖了反射操作的各个方面,如动态创建对象、设置和获取字段值、调用方法等。测试环境为标准的Java开发环境,采用最新的JDK版本,以确保结果的可靠性和...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java程序具有了高度的灵活性和动态性,尤其在框架开发、插件系统...
Java反射技术浅谈 Java反射技术是一种可以访问、检测和修改程序本身状态或行为的能力。通过反射,Java程序可以加载一个运行时才知道名称的类,得到其完整内部信息,并创建其对象,或对其属性设值,或调用其方法。...
### Java构造方法详解 ...理解构造方法的工作原理、如何正确调用以及在继承中的行为,是成为一名熟练的Java开发者的基础。通过本文的详细阐述,希望读者能够对Java构造方法有更深入的理解和掌握。
当我们创建一个类的新实例时,Java会自动调用对应的构造方法来设置对象的初始状态。 ### 1. 构造方法的作用 - **初始化对象**:构造方法的主要目的是为新创建的对象设置初始值,确保对象处于可使用的状态。 - **...