`

java.lang.reflect.Constructor

阅读更多
package java.lang.reflect;

import sun.reflect.ConstructorAccessor;
import sun.reflect.Reflection;

/**
 * 表示构造函数的对象
 * 
 * comment by liqiang
 *
 * @author Kenneth Russell
 * @author Nakul Saraiya
 */
public final
class Constructor extends AccessibleObject implements Member {

 //声明此构造函数的类对象
    private Class  clazz;
    private int   slot;
    //参数列表数组
    private Class[]  parameterTypes;
    //异常数组
    private Class[]  exceptionTypes;
    //修饰符
    private int   modifiers;
    //真正实现功能的类,当前类只是它的代理
    private volatile ConstructorAccessor constructorAccessor;
    //由coyp的来的对象,回保留原对象的引用
    private Constructor         root;

    //包内的构造函数
    Constructor(Class declaringClass,
                Class[] parameterTypes,
                Class[] checkedExceptions,
                int modifiers,
                int slot)
    {
        this.clazz = declaringClass;
        this.parameterTypes = parameterTypes;
        this.exceptionTypes = checkedExceptions;
        this.modifiers = modifiers;
        this.slot = slot;
    }

    /**
     * 返回当前构造函数对象的一个拷贝
     */
    Constructor copy() {
     //用此对象的数据生成新的构造函数对象
        Constructor res = new Constructor(clazz, parameterTypes,
                                          exceptionTypes, modifiers, slot);
        //新构造函数的root指向自己
        res.root = this;
        //与新的构造函数对象共享ConstructorAccessor
        res.constructorAccessor = constructorAccessor;
        return res;
    }

    //返回定义此构造函数的类
    public Class getDeclaringClass() {
 return clazz;
    }

    //取得构造函数的名,它与类名一致
    public String getName() {
 return getDeclaringClass().getName();
    }

    //取得修饰符
    public int getModifiers() {
 return modifiers;
    }

    //取得此对象的参数列表
    public Class[] getParameterTypes() {
 return Method.copy(parameterTypes);
    }

    //返回此构造函数定义的异常列表,如果没有定义异常,则返回0长度数组
    public Class[] getExceptionTypes() {
 return Method.copy(exceptionTypes);
    }

    /**
     * 判断指定对象obj是否与当前构造函数对象相等
     */
    public boolean equals(Object obj) {
 if (obj != null && obj instanceof Constructor) {//对象不为null,且为构造函数对象
  //转型
     Constructor other = (Constructor)obj;
     if (getDeclaringClass() == other.getDeclaringClass()) {
     //两对象的定义类相等,这是他们的名称也一定相等
      
  Class[] params1 = parameterTypes;
  Class[] params2 = other.parameterTypes;
  
  //比较参数列表
  if (params1.length == params2.length) {
      for (int i = 0; i < params1.length; i++) {
   if (params1[i] != params2[i])
       return false;
      }
      return true;
  }
  
     }
 }
 
 //两个对象不等
 return false;
    }

    //返回hashCode
    public int hashCode() {
 return getDeclaringClass().getName().hashCode();
    }

    /**
     * 返回构造函数的字符串描述
     */
    public String toString() {
 try {
     StringBuffer sb = new StringBuffer();
     int mod = getModifiers();
     
     if (mod != 0) {
  //标志符
     sb.append(Modifier.toString(mod) + " ");
     }
     
     //注意它这里用的是Field方法中显示类的名字,这个方法显示数组类型跟Class.getName()不同
     //类名
     sb.append(Field.getTypeName(getDeclaringClass()));
     sb.append("(");
     
     //显示参数列表用","分隔
     Class[] params = parameterTypes; // avoid clone
     for (int j = 0; j < params.length; j++) {
  sb.append(Field.getTypeName(params[j]));
  if (j < (params.length - 1))
      sb.append(",");
     }
     sb.append(")");
     
     //显示异常列表用","分隔
     Class[] exceptions = exceptionTypes; // avoid clone
     if (exceptions.length > 0) {
  sb.append(" throws ");  
  for (int k = 0; k < exceptions.length; k++) {
      sb.append(exceptions[k].getName());
      if (k < (exceptions.length - 1))
   sb.append(",");
  }
  
     }
     return sb.toString();
 } catch (Exception e) {
     return "<" + e + ">";
 }
    }

    /**
     * 此类最重要的方法
     * 构造一个类的实例,如果构造函数是无参的,传入的数组为null或长度为0,
     * 原始类型的参数需要封装成其包装类
     * 
     */
    public Object newInstance(Object[] initargs)
 throws InstantiationException, IllegalAccessException,
               IllegalArgumentException, InvocationTargetException
    {
        if (!override) {//做检查
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class caller = Reflection.getCallerClass(2);
                if (securityCheckCache != caller) {
                 //上一个通过的调用者的Class对象被缓存,如果与上次通过的不同,则进行安全检查
                    Reflection.ensureMemberAccess(caller, clazz, null, modifiers);
                    securityCheckCache = caller;
                }
            }
        }
        
        //检查acquireConstructorAccessor
        if (constructorAccessor == null) acquireConstructorAccessor();
        
        //Constructor只是代理类,实现创建对象的操作是在ConstructorAccessor中
        return constructorAccessor.newInstance(initargs);
    }

    private void acquireConstructorAccessor() {
        ConstructorAccessor tmp = null;
        //取得上层的ConstructorAccessor
        if (root != null) tmp = root.getConstructorAccessor();
        if (tmp != null) {
         //如果上层的ConstructorAccessor不为空,则将上层的
         //ConstructorAccessor付给当前的ConstructorAccessor,并返回
            constructorAccessor = tmp;
            return;
        }
        
        //上层没有则创建一个
        tmp = reflectionFactory.newConstructorAccessor(this);
        setConstructorAccessor(tmp);
    }

    //直接返回onstructorAccessor
    ConstructorAccessor getConstructorAccessor() {
        return constructorAccessor;
    }

    //设置当前的constructorAccessor对象,会是上次的constructorAccessor对象都改变
    void setConstructorAccessor(ConstructorAccessor accessor) {
        //将当前的constructorAccessor对象置为新的ConstructorAccessor对象
     constructorAccessor = accessor;
        
     //递归调用上层的设置ConstructorAccessor对象的方法
        if (root != null) {
            root.setConstructorAccessor(accessor);
        }
    }

    int getSlot() {
        return slot;
    }
}

 

分享到:
评论

相关推荐

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    JAVA反射实现和实现机制

    2. **`java.lang.reflect.Constructor`**:表示类的构造器。 3. **`java.lang.reflect.Field`**:表示类的成员变量。 4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:...

    项目源码-java进销存管理系统

    【项目源码】-java进销存管理系统 ... import java.awt.BorderLayout; import java.awt.Color;...import java.lang.reflect.Constructor; import java.net.URL; import java.util.HashMap; import java.util.Map;

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field类提供了有关类或接口的单个域的信息。利用这个类,我们可以得到...

    java的类反射

    反射的核心类包括`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`。下面将详细阐述这些核心类以及反射的主要用法。 1. `java.lang.Class`:每个类在...

    【Java基础笔记】反射.docx

    在Java中,反射主要涉及到`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。下面将详细介绍这些知识点。 1. **反射的概述** 反射机制使得Java...

    java反射机制[参照].pdf

    反射机制的核心在于Java Reflection API,其中包括`java.lang.Class`,`java.lang.reflect.Method`,`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。 首先,`java.lang.Class`是所有Java类的元...

    java面试题--反射机制

    Object newObj = constructor.newInstance(value); System.out.println(newObj); // 输出: hello, World! } } ``` #### 九、总结 通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java...

    Java语言的动态属性总结[参考].pdf

    5. **Java.lang.reflect.Constructor**: 提供了关于类构造器的信息,并允许我们在运行时创建新对象。 6. **Java.lang.annotation.Annotation**: 这是一个接口,表示在代码中使用的注解。注解可以附加在类、字段、...

    Java EE:Reflect 反射技术.docx

    - `java.lang.reflect.Constructor`:表示类的构造函数,用于创建类的新实例。 3. 获取Class对象的途径: - 通过类名获取:`类名.class` - 通过对象获取:`对象名.getClass()` - 通过类的全名获取:`Class.forName...

    java 反射例子 代码

    java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

    java反射机制的应用

    4. `java.lang.reflect.Constructor`:表示类的构造器,用于创建对象。 5. `java.lang.reflect.Array`:处理数组的静态类。 **四、应用场景** 1. **插件化开发**:动态加载插件中的类和资源,无需提前知晓具体实现...

    java学习资料-反射机制深入理解剖析

    2. 动态创建对象,使用`Constructor.newInstance()`方法。 3. 访问类的成员变量,包括私有变量,通过`Field.get()`和`Field.set()`。 4. 调用类的方法,包括私有方法,使用`Method.invoke()`。 5. 创建动态代理,...

    java反射机制

    4. `java.lang.reflect.Constructor`:表示类的构造函数。Constructor对象提供了创建类实例的能力,如`newInstance(args...)`可以创建一个新的类实例。 反射机制的使用场景广泛,包括但不限于: - 在运行时动态...

    Java软件开发实战 Java基础与案例开发详解 15-1 反射 共13页.pdf

    Object obj = constructor.newInstance("Hello"); ``` #### 15.4 使用反射调用方法和操作成员变量 反射不仅可以用于创建对象,还可以用于调用方法和修改成员变量: 1. **调用方法**: - 使用`getMethod`或`...

    java 反射与动态代理

    这是通过`java.lang.Class`类和相关类如`java.lang.reflect.Field`、`java.lang.reflect.Method`以及`java.lang.reflect.Constructor`来实现的。 1. **获取类信息**:通过`Class.forName()`方法,我们可以根据类名...

    Java反射机制的工作原理详解.docx

    在Java中,反射机制主要通过`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`等类来实现。 **一、反射机制的主要功能** 1. **运行时判断对象所属的类...

    JAVA 反射详解PPT

    反射机制的核心类主要包括`java.lang.Class`,`java.lang.reflect.Method`,`java.lang.reflect.Field`和`java.lang.reflect.Constructor`。这些类提供了访问和操作类、方法、字段和构造器的API。例如,`Class`类...

    Java反射机制

    4. **`java.lang.reflect.Constructor`**:用于获取并调用类的构造函数。 5. **`java.lang.reflect.Proxy`**:提供动态代理的功能,可以创建代理类和实例。 #### 三、Java反射机制提供的功能 1. **获取类的Class...

Global site tag (gtag.js) - Google Analytics