JDK14/Java14源码在线阅读

/*
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

(function () {

// Check if java.desktop module is available and we're running in non-headless mode.
// We access AWT via script to avoid direct dependency on java.desktop module.
function isHeadless() {
    var GraphicsEnvironment = java.awt.GraphicsEnvironment;
    return Java.isType(GraphicsEnvironment)? GraphicsEnvironment.isHeadless() : true;
}


// Function that shows a JFileChooser dialog and returns the file name chosen (if chosen).
// We access swing from script to avoid direct dependency on java.desktop module.
function chooseFile() {
    var JFileChooser = javax.swing.JFileChooser;
    if (!Java.isType(JFileChooser)) {
        return null;
    }

    var ExtensionFilter = javax.swing.filechooser.FileNameExtensionFilter;
    function run() {
        var chooser = new JFileChooser();
        chooser.fileFilter = new ExtensionFilter('JavaScript Files', 'js');
        var retVal = chooser.showOpenDialog(null);
        return retVal == JFileChooser.APPROVE_OPTION ?
            chooser.selectedFile.absolutePath : null;
    }

    var FutureTask = java.util.concurrent.FutureTask;
    var fileChooserTask = new FutureTask(run);
    javax.swing.SwingUtilities.invokeLater(fileChooserTask);

    return fileChooserTask.get();
}

// Function that opens up the desktop browser application with the given URI.
// We access AWT from script to avoid direct dependency on java.desktop module.
function browse(uri) {
    var Desktop = java.awt.Desktop;
    if (Java.isType(Desktop)) {
        Desktop.desktop.browse(uri);
    }
}

function printDoc(list) {
    list.forEach(function(doc) {
        print();
        print(doc.signature());
        print();
        print(doc.javadoc());
    });
}

var JShell = null;
var jshell = null;

function javadoc(obj) {
    var str = String(obj);
    if (!JShell) {
        // first time - resolve JShell class
        JShell = Packages.jdk.jshell.JShell;
        // if JShell class is available, create an instance
        jshell = Java.isType(JShell)? JShell.create() : null;
    }

    if (!jshell) {
        // we don't have jshell. Just print the default!
        return print(str);
    }

    /*
     * A java method object's String representation looks something like this:
     *
     * For an overloaded method:
     *
     *   [jdk.dynalink.beans.OverloadedDynamicMethod
     *      String java.lang.System.getProperty(String,String)
     *      String java.lang.System.getProperty(String)
     *    ]
     *
     * For a non-overloaded method:
     *
     *  [jdk.dynalink.beans.SimpleDynamicMethod void java.lang.System.exit(int)]
     *
     * jshell expects "java.lang.System.getProperty(" or "java.lang.System.exit("
     * to retrieve the javadoc comment(s) for the method.
     */
    var javaCode = str.split(" ")[2]; // stuff after second whitespace char
    javaCode = javaCode.substring(0, javaCode.indexOf('(') + 1); // strip argument types

    try {
        var analysis = jshell.sourceCodeAnalysis();
        var docList = analysis.documentation(javaCode, javaCode.length, true);
        if (!docList.isEmpty()) {
            return printDoc(docList);
        }

        /*
         * May be the method is a Java instance method. In such a case, jshell expects
         * a valid starting portion of an instance method call expression. We cast null
         * to Java object and call method on it. i.e., We pass something like this:
         *

/**代码未完, 请加载全部代码(NowJava.com).**/
展开阅读全文

关注时代Java

关注时代Java