今天在家,突然想到了老师讲课没有讲到过反射机制,这是JDK1.5加入的新功能,通过反射,可以在程序中访问已经装载到JVM里的java对象描述,实现访问、检测和修改java对象本身信息的功能.
先列出来我下面写的这个小例子用到的方法
getClass():返回此 类 的运行时类
getDeclaredConstructors():获得构造方法,返回Constructor[]
isVarArgs():构造方法是否含有可变数量的参数
getParameterTypes():构造方法的入口参数类型,返回Class[]
getExceptionTypes():可能抛出的异常,返回Class[]
newInstance():表示的构造方法来创建该构造方法的声明类的新实例,我觉得这个可以想成构造方法的代替。
Example_01 Code:
public class Example_01 {
String s;
int i, i2, i3;
private Example_01() {
}
protected Example_01(String s, int i) {
this.s = s;
this.i = i;
}
public Example_01(String...strings) {
if(0 < strings.length) {
i = Integer.valueOf(strings[0]);
}
if(1 < strings.length) {
i2 = Integer.valueOf(strings[1]);
}
if(2 < strings.length) {
i3 = Integer.valueOf(strings[2]);
}
}
public void print() {
System.out.println("s = " + s);
System.out.println("i = " + i);
System.out.println("i2 = " + i2);
System.out.println("i3 = " + i3);
}
}
Main_01 Code:
import java.lang.reflect.Constructor;
/**
* 测试类,通过反射访问Example_01类中的所有构造方法,并将该构造方法
* 是否允许带有可变数量的参数、入口参数类型和可能抛出的异常类型输出
* @author Xue
*
*/
public class Main_01 {
public static void main(String[] args) {
Example_01 example = new Example_01("10", "20", "30");
Class exampleC = example.getClass();//返回此 类 的运行时类
//获得所有构造方法
Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();
for(int i = 0; i <declaredConstructors.length; i++) {
//遍历构造方法
Constructor constructor = declaredConstructors[i];
System.out.println("查看是否允许带有可变数量的参数:" + constructor.isVarArgs());
System.out.println("该构造方法的入口参数依次是:");
//获取所有参数类型
Class[] parameterTypes = constructor.getParameterTypes();
for(int j = 0; j < parameterTypes.length; j++) {
System.out.println("" + parameterTypes[j]);
}
System.out.println("该构造方法可能抛出的异常类型为:");
//获取所有可能抛出的异常
Class[] exceptionTypes = constructor.getExceptionTypes();
for(int j = 0; j < exceptionTypes.length; j++) {
System.out.println("" + exceptionTypes[j]);
}
Example_01 example2 = null;
while(example2 == null) {
//如果访问权限是private,则抛出异常,既不允许访问
try {
if(i == 0) {//通过执行默认没有参数的构造方法创建对象
example2 = (Example_01) constructor.newInstance();
} else if(i ==1) {//通过执行有两个参数的构造方法创建对象
example2 = (Example_01) constructor.newInstance("7" ,5);
} else {//通过执行可变参数的构造方法来创建对象
Object[] parameter = new Object[]{new String[]{"100", "200", "300"}};
example2 = (Example_01) constructor.newInstance(parameter);
}
} catch (Exception e) {
System.out.println("在创建对象的时候抛出异常,下面执行setAccessibl()方法");
constructor.setAccessible(true); //更改为可访问
}
}
}
}
}
分享到:
相关推荐
JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...
1. **基本概念**:反射是Java提供的一种能力,允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并操作这些信息。 2. **获取Class对象**:`Class.forName()`或对象的`getClass()`方法可以获取到对应的...
在Java编程中,反射扮演着重要角色,尤其在动态加载类、创建对象、调用方法以及访问私有成员等方面。下面我们将深入探讨Java反射的核心知识点。 1. **Chp16** - 可能指的是某个教程或书籍中的第16章,专门讲解反射...
### Java反射知识总结 #### 一、反射的概念与意义 反射是Java中一项非常重要的特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象、调用方法等。这种能力使得Java程序具有了极大的灵活性,特别...
1. Class类:在Java中,每一个类都有一个对应的Class对象,它包含了该类的所有信息,如类名、包名、父类、接口、构造器、方法、字段等。我们可以通过Class.forName()方法或者对象的getClass()方法获取到Class对象。...
通过反射,开发者可以实现动态加载类、创建对象、调用方法以及访问和修改字段,极大地增强了程序的灵活性和可扩展性。 一、Class类的初始化 当Java程序首次遇到以下情况之一时,会触发类的初始化: 1. 遇到`new`...
反射机制是Java提供的一种动态类型能力,它使得我们能够在运行时分析类和对象,甚至能够调用私有方法和访问私有变量。这个“反射案例-仅供查考”可能包含了一系列关于如何使用反射进行实际操作的例子。 1. **反射的...
- `Class`对象提供了多种方法来获取类的详细信息,如`getModifiers()`获取访问修饰符,`getConstructors()`获取构造方法,`getMethods()`获取公共方法,`getDeclaredMethods()`获取包括私有方法在内的所有方法,`...
3. 测试构造方法: - `Constructor[] getConstructors()`: 获取所有公共构造器。 - `Constructor<T> getConstructor(Class<?>... parameterTypes)`: 获取具有指定参数类型的公共构造器。 - `Constructor[] ...
在C#编程中,反射是一项强大的工具,它允许我们在运行时检查类型信息并动态地创建对象实例、调用方法或访问字段。本文将深入探讨反射的应用和原理,以帮助你提升C#技能。 首先,我们要理解什么是反射。反射是.NET...
4. 访问构造函数 我们可以使用Type的GetConstructors方法获取类的所有构造函数,然后根据需要选择合适的构造函数实例化对象。例如: ```csharp ConstructorInfo constructor = myType.GetConstructor(new Type[] { ...
通过反射,我们可以动态地创建对象、调用方法、访问字段,甚至在运行时发现和修改类的行为。以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全...
- 从最高超类到当前类,静态成员按顺序初始化,然后调用默认构造方法,每次调用构造方法前先初始化非静态对象,最后是当前类的非静态成员初始化和构造方法调用。 4. **构造方法** - 类可以没有构造方法,但有多个...
1. 反射操作通常比直接调用方法或构造器慢,因此在性能敏感的代码中应谨慎使用。 2. 不要滥用反射来访问私有成员,这可能破坏封装原则,导致难以预料的行为。 3. 使用反射时,需要处理可能抛出的异常,如`...
### Java经典Socket编程与反射知识点详解 #### 一、Java Socket编程 ##### 1.1 Socket编程_TCP服务器端 **知识点描述**: 掌握Java Socket编程的基础知识,并能够编写简单的TCP服务器端程序。 **详细说明**: - *...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。
* 类和对象的概念、类的组成部分:成员变量、构造方法、普通方法。 * 抽象类和接口的概念、抽象类和接口的区别。 继承和多态 -------------- * 继承的概念、继承的实现、继承的特点。 * 多态的概念、多态的实现、...
1. **反射的概念** 反射机制使得Java程序能够在运行时动态地获取类的信息,包括类名、包信息、属性、方法、注解等,并能够动态地调用对象的方法和访问其属性,即使这些方法或属性是私有的。在Java中,反射主要涉及`...
代码中使用了`getDeclaredConstructor`方法来获取一个指定类型的构造器,并且设置访问权限以便可以调用私有构造器。 知识点: - `getDeclaredConstructor`方法用于获取指定类型的构造器。 - 使用`setAccessible...
3. 获取构造方法:利用反射可以获取类的构造方法,这包括获取类的所有构造方法,获取指定的构造方法,获取公有的构造方法,以及获取包括私有在内的所有构造方法。获取之后,可以通过Constructor对象的newInstance()...