private Constructor<T> getConstructor0(Class[] parameterTypes,
int which) throws NoSuchMethodException
{
Constructor[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC)); //获取public的构造方法
for (int i = 0; i < constructors.length; i++) {
if (arrayContentsEq(parameterTypes,
constructors[i].getParameterTypes())) {
return getReflectionFactory().copyConstructor(constructors[i]); //返回构造方法的对象
}
}
throw new NoSuchMethodException(getName() + ".<init>" + argumentTypesToString(parameterTypes));
}
//
// Other helpers and base implementation
//
private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
if (a1 == null) {//比较构造方法的参数
return a2 == null || a2.length == 0;
}
if (a2 == null) {
return a1.length == 0;
}
if (a1.length != a2.length) {
return false;
}
for (int i = 0; i < a1.length; i++) {
if (a1[i] != a2[i]) {
return false;
}
}
return true;
}
//
//
// java.lang.reflect.Constructor handling
//
//
// Returns an array of "root" constructors. These Constructor
// objects must NOT be propagated to the outside world, but must
// instead be copied via ReflectionFactory.copyConstructor.
private Constructor[] privateGetDeclaredConstructors(boolean publicOnly) {
checkInitted();
Constructor[] res = null;
if (useCaches) {
clearCachesOnClassRedefinition();
if (publicOnly) {
if (publicConstructors != null) {
res = (Constructor[]) publicConstructors.get();
}
} else {
if (declaredConstructors != null) {
res = (Constructor[]) declaredConstructors.get();
}
}
if (res != null) return res;
}
// No cached value available; request value from VM
if (isInterface()) {
res = new Constructor[0];
} else {
res = getDeclaredConstructors0(publicOnly); //本地方法,获取声明的构造方法
}
if (useCaches) {
if (publicOnly) {
publicConstructors = new SoftReference(res);
} else {
declaredConstructors = new SoftReference(res);
}
}
return res;
}
分享到:
相关推荐
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
- **异常路径**:`java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.lang.RuntimeException -> java.lang.IndexOutOfBoundsException -> java.lang.ArrayIndexOutOfBoundsException` ...
Class类的特点是没有公共构造方法,Class对象是在加载类时由Java虚拟机自动构造的,因此不能显式地声明一个Class对象。虚拟机为每种类型管理一个独一无二的Class对象,每个类(型)都有一个Class对象。 获取Class...
通过`Class`对象,我们可以获取关于类的信息,如类的名称、构造函数、方法等。`Class.forName()`方法可以动态加载类。 `Object`类是所有Java类的最终超类,包含所有对象共有的属性和方法,如`equals()`比较两个对象...
System.out.println("初始化构造方法"); } private static StaticParamsSingle buildStaticParams() { if (sps == null) { sps = new StaticParamsSingle(); } int result = NUM_A + NUM_B; System.out....
在Java 2中,一些新类和方法被添加到`java.lang`包,如`ThreadLocal`、`RuntimePermission`等,以增强安全性、多线程支持和性能优化。 值得注意的是,虽然`java.lang`包中的许多类在早期版本的Java中就已经存在,但...
在Java 2版本中,java.lang包引入了一些新的类和接口,例如InheritableThreadLocal、RuntimePermission等,以增强多线程特性和安全控制。同时,一些过时的方法也被标记出来,虽然仍可供老程序使用,但不建议在新代码...
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
`java.lang.ExceptionInInitializerError` 是Java编程语言中一个特殊的运行时异常,它通常表示在类的静态初始化过程中发生了异常。这个错误不是因为类的构造函数,而是由于静态变量初始化或者静态初始化块(也称为...
2. 获取值:使用`getString()`、`getInt()`、`getLong()`等方法获取不同类型的值,或者使用`get()`获取Object类型,然后进行类型转换。例如: ```java String name = jsonObject.getString("name"); int age = ...
- **Class**: 表示运行时的类信息,可以用来获取类的方法、字段等信息。 - **Object**: 所有Java类的根类,包含了对象的基本操作,如equals()、toString()等。 - **System**: 提供系统相关的属性和操作,如标准...
例如,`java.lang.Class`类提供了获取类信息的方法,`java.lang.reflect.Field`用于访问字段,`java.lang.reflect.Method`用于调用方法,而`java.lang.reflect.Constructor`则用于操作构造器。 获取类的三种方式:...
通过`Class`对象,我们可以动态地获取类的信息,如类名、构造函数、方法等,并能创建类的实例。这对于实现元编程和动态加载类等功能非常关键。 【Object】类是所有Java类的超类,它定义了一些通用的方法,如`equals...
6. **ClassUtils**: 反射相关的帮助类,可以用来获取类的信息、创建实例、检查兼容性等。 7. **ReflectionUtils**: 更强大的反射工具,可以方便地访问和操作类的字段、方法、构造器等。 在搭建Hadoop集群并使用...
2. **`java.lang.reflect.Constructor`**:表示类的构造器。 3. **`java.lang.reflect.Field`**:表示类的成员变量。 4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:...
通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量和方法。 获取Class对象 ---------------- 在Java中,Class对象是反射机制的基础。我们可以...
3. **通过`Class`类的静态方法`forName()`获取**:如`Class.forName("java.lang.String")`。 #### 六、动态加载类 动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`...
Java.lang.Void类是一个不可实例化的占位符类,它的主要作用是持有对Java关键字void的Class对象的引用。该类的源码解析对应的内容如下: 首先,Void类的定义为public final class Void {},其中final关键字表明该类...
- `java.lang.Class`:表示运行时的类信息,通过类名获取`Class`对象的方法有`forName()`、`getClass()`、`类名.class`等。 - `java.lang.reflect.Method`:表示类的方法信息,提供了获取方法和调用方法的功能。 ...