`

java.lang.class学习2--获取构造方法的过程,

阅读更多

 

    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;
    }

   
分享到:
评论

相关推荐

    javabiginteger源码-Java:Java

    ##-----java.lang.Class类----- 5. 为什么说Class类不能被继承? 6. 为什么说我们不能 new Class()? 7. forName()中执行了什么流程? 8. toString()返回什么? 9. newInstance()中执行了什么? ##-----java.lang....

    java编程常见问题

    33.java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java...当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。

    Java-Reflection-Tutorial.pdf

    java 反射实战demo,Java的反射(reflection)机制是指在程序的运行...我理解的Java反射的原理就是获取Class对象然后使用java.lang.reflect里提供的方法操作Class对象,Class与java.lang.reflect构成了java的反射技术。

    Java 高级特性.doc

    class.newInstance()内部其实就是在用默认的构造方法 ----------------------- 讲Method //方法 Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class); System.out.println...

    Java程序设计复习题.doc

    一、选择题: 1. 运行Java程序需要的工具软件所在的目录是 A 。 A.JDK的bin目录 B.JDK的demo目录 C.JDK的lib目录 D.JDK的jre目录 2. 下列关于Java语言特点的叙述中,错误的是 A ... A.Java语言规定构造方法名与

    1Java程序设计复习题.doc

    一、选择题: 1. 运行Java程序需要的工具软件所在的目录是 A 。 A.JDK的bin目录 B.JDK的demo目录 C.JDK的lib目录 D.JDK的jre目录 2. 下列关于Java语言特点的叙述中,错误的是 A ... A.Java语言规定构造方法名与

    commons-lang3-3.1 API

    lang.builder包包含了一组用于产生每个Java类中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理Java标准API中的...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    //构造方法 java.lang.reflect.Field; //类的成员变量 java.lang.reflect.Method;//类的方法 java.lang.reflect.Modifier;//访问权限 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第6页。 3.2.4 ...

    Java跳过构造方法新建对象

     (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。  (3) 调用对象的clone()方法。  (4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 ...

    java反射机制原理详解.docx

    java.lang.Class:是反射的源头 我们创建一个类,通过编译,生成对应的.calss文件,之后使用java.exe加载(jvm的类加载器)此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在缓存区,那么这个运行时类...

    基础深化和提高-Java多线程技术

    实现Runnable接口:创建一个类实现java.lang.Runnable接口,实现run()方法,并将该实现类传递给Thread类的构造函数中。然后创建Thread实例并启动线程。 java class MyRunnable implements Runnable { public void r

    Java 面试宝典

    2、Java 有没有 goto? ....................................................................................................... 8 3、说说&和&&的区别。 ......................................................

    Java程序设计复习题.docx.docx

    Java语言规定构造方法名与类名必须相同 Java语言规定构造方法没有返回值,但不用void声明 Java语言规定构造方法不可以重载 Java语言规定构造方法只能通过new自动调用 下列叙述中错误的是 D 。 Java Application与...

    Java 基础核心总结 +经典算法大全.rar

    构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 ...

    struts_2.3.12GA_API文档(chm版本)

    摘要: 嵌套 | 字段 | 构造方法 | 方法 详细信息: 字段 | 构造方法 | 方法 -------------------------------------------------------------------------------- com.opensymphony.xwork2 类 ActionSupport ...

    prototype.js 1.4 原代码阅读

    * 要使用 X 类型,需继续用 new X()来获取一个实例,如同 java 的 Class.newInstance()方法。 * * 返回的构造函数会执行名为 initialize 的方法, initialize 是 Ruby 对象的构造器方法名字。 * 此时initialize...

    java反射例子

    System.out.println("构造方法:"+constructor[i]); } //方法二 for (int i = 0; i &lt; constructor.length; i++) { Class&lt;?&gt; p[]=constructor[i].getParameterTypes(); System.out.print("构造方法: ");...

    上海交大网络面向对象程序设计Java第一、二、三次作业答案.doc

    但不可用void 声明 C) Java 语言规定构造方法不可重载 D) Java 语言规定构造方法只能通过new自动调用 2、作为Java应用程序入口的main方法,其声明格式可以是( B ) A) public void main(String [] args) B) public ...

Global site tag (gtag.js) - Google Analytics