请选择 进入手机版 | 继续访问电脑版

IDEA编译JDK1.8源码及运行测试--终于可以debug进带注释的JDK源码了

[复制链接]
小甜心 发表于 2021-1-1 18:33:33 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
目次
一、JDK源码源码导入IDEA前资源准备
1.在自己安装好的JDK1.8版本目次下,找到src.zip,这个就是源码(没有JDK1.8的自行去官网下载,我的版本是jdk1.8.0_271)
2.在自己电脑磁盘新建项目目次JDK1.8.0_271_source,将src解压到项目目次下,然后删掉src.zip
二、导入IDEA并设置
1.File-Open,找到自己项目导入
2.导进入后,你打开一个java文件会发现这个不可识别。此时需要将src标志为资源目次即可
3.设置编译内存,由原来的700改成1000大概更高,防止反面编译内存不敷而失败
4.新建sun包,awt包和UNIXToolkit类,font包和FontConfigManager。类的详细内容文章最反面会给出
5.打开项目设置,将Jdk的lib目次下的tools.jar导入项目,编译所需要它
6.设置一个新的JDK,然后改名称,并设置源码为自己的代码 待会debug可以切换进来
三、编写测试类
1.在src目次下编写一个测试类MainTest.java并运行,便会自动编译(确保上面每一步做到位,编译才不会出错)
2.编译乐成后,在自己源码HashMap构造函数加断点并加注释
3.debug运行MainTest.java进入源码
四、JDK缺少的类内容
1.sun.awt.UNIXToolkit
2.sun.font.FontConfigManager
一、JDK源码源码导入IDEA前资源准备

1.在自己安装好的JDK1.8版本目次下,找到src.zip,这个就是源码(没有JDK1.8的自行去官网下载,我的版本是jdk1.8.0_271)


 
2.在自己电脑磁盘新建项目目次JDK1.8.0_271_source,将src解压到项目目次下,然后删掉src.zip


 
二、导入IDEA并设置

1.File-Open,找到自己项目导入


     
     最终项目目次效果     
2.导进入后,你打开一个java文件会发现这个不可识别。此时需要将src标志为资源目次即可



 
3.设置编译内存,由原来的700改成1000大概更高,防止反面编译内存不敷而失败


 
4.新建sun包,awt包和UNIXToolkit类,font包和FontConfigManager。类的详细内容文章最反面会给出

     
     添加缺少内容     
5.打开项目设置,将Jdk的lib目次下的tools.jar导入项目,编译所需要它



     
     引入tools.jar        
     最终效果     
6.设置一个新的JDK,然后改名称,并设置源码为自己的代码 待会debug可以切换进来


     
     设置一个新的JDK        
     改名称     

这一步是关键,设置了后,待会debug就可以切换成自己源码目次了
     
     替换源码目次    Apply 生存以上所有设置,IDEA设置竣事!
 
三、编写测试类

1.在src目次下编写一个测试类MainTest.java并运行,便会自动编译(确保上面每一步做到位,编译才不会出错)


提示设置输出class目次

点击OK,跳出目次,先在源码路径下创建文件夹out,然后设置在项目路径下out目次下即可

     
     运行编译中        
     编译乐成,用了差不多2分钟     
2.编译乐成后,在自己源码HashMap构造函数加断点并加注释

双击shift搜索HashMap,确保是进入本项目源码构造函数,而不是jdk自带的源码那
     
     本项目下搜索​​​​    加断点和注释
     
     给自己项目源码加断点加注释     

3.debug运行MainTest.java进入源码


进自己源码还需要自行去切换,有些如果没有disable这个弹出,需要自己搜索去设置(https://blog.csdn.net/qq_28455613/article/details/81382484

切换,进来了

 
最终完成编译与测试。
 
四、JDK缺少的类内容

1.sun.awt.UNIXToolkit

  1. package sun.awt;/** * @author :HUANG ZHI XUE * @date :Create in 2020-12-31 */import com.sun.java.swing.plaf.gtk.GTKConstants.TextDirection;import sun.java2d.opengl.OGLRenderQueue;import sun.security.action.GetIntegerAction;import sun.security.action.GetPropertyAction;import java.awt.*;import java.awt.color.ColorSpace;import java.awt.image.*;import java.security.AccessController;import java.security.PrivilegedAction;import static java.awt.RenderingHints.*;public abstract class UNIXToolkit extends SunToolkit{    /** All calls into GTK should be synchronized on this lock */    public static final Object GTK_LOCK = new Object();    private static final int[] BAND_OFFSETS = { 0, 1, 2 };    private static final int[] BAND_OFFSETS_ALPHA = { 0, 1, 2, 3 };    private static final int DEFAULT_DATATRANSFER_TIMEOUT = 10000;    // Allowed GTK versions    public enum GtkVersions {        ANY(0),        GTK2(Constants.GTK2_MAJOR_NUMBER),        GTK3(Constants.GTK3_MAJOR_NUMBER);        static class Constants {            static final int GTK2_MAJOR_NUMBER = 2;            static final int GTK3_MAJOR_NUMBER = 3;        }        final int number;        GtkVersions(int number) {            this.number = number;        }        public static GtkVersions getVersion(int number) {            switch (number) {                case Constants.GTK2_MAJOR_NUMBER:                    return GTK2;                case Constants.GTK3_MAJOR_NUMBER:                    return GTK3;                default:                    return ANY;            }        }        // major GTK version number        public int getNumber() {            return number;        }    };    private Boolean nativeGTKAvailable;    private Boolean nativeGTKLoaded;    private BufferedImage tmpImage = null;    public static int getDatatransferTimeout() {        Integer dt = (Integer)AccessController.doPrivileged(                new GetIntegerAction("sun.awt.datatransfer.timeout"));        if (dt == null || dt  Boolean.getBoolean("jdk.gtk.verbose"));    }}
复制代码
 

2.sun.font.FontConfigManager

[code]package sun.font;/** * @author :HUANG ZHI XUE * @date :Create in 2020-12-31 */import sun.awt.SunHints;import sun.awt.SunToolkit;import sun.util.logging.PlatformLogger;import java.util.Locale;/** * Small utility class to manage FontConfig. */public class FontConfigManager {    static boolean fontConfigFailed = false;    /* This is populated by native */    private static final FontConfigInfo fcInfo = new FontConfigInfo();    /* Begin support for GTK Look and Feel - query libfontconfig and     * return a composite Font to Swing that uses the desktop font(s).     */    /* These next three classes are just data structures.     */    public static class FontConfigFont {        public String familyName;        // eg Bitstream Vera Sans        public String styleStr;          // eg Bold        public String fullName;          // eg Bitstream Vera Sans Bold        public String fontFile;          // eg /usr/X11/lib/fonts/foo.ttf    }    public static class FcCompFont {        public String fcName;            // eg sans        public String fcFamily;          // eg sans        public String jdkName;           // eg sansserif        public int style;                // eg 0=PLAIN        public FontConfigFont firstFont;        public FontConfigFont[] allFonts;        //boolean preferBitmaps;    // if embedded bitmaps preferred over AA        public CompositeFont compFont;   // null if not yet created/known.    }    public static class FontConfigInfo {        public int fcVersion;        public String[] cacheDirs = new String[4];    }    /* fontconfig recognises slants roman, italic, as well as oblique,     * and a slew of weights, where the ones that matter here are     * regular and bold.     * To fully qualify what we want, we can for example ask for (eg)     * Font.PLAIN             : "serif:regular:roman"     * Font.BOLD              : "serif:bold:roman"     * Font.ITALIC            : "serif:regular:italic"     * Font.BOLD|Font.ITALIC  : "serif:bold:italic"     */    private static String[] fontConfigNames = {            "sans:regular:roman",            "sans:bold:roman",            "sans:regular:italic",            "sans:bold:italic",            "serif:regular:roman",            "serif:bold:roman",            "serif:regular:italic",            "serif:bold:italic",            "monospace:regular:roman",            "monospace:bold:roman",            "monospace:regular:italic",            "monospace:bold:italic",    };    /* This array has the array elements created in Java code and is     * passed down to native to be filled in.     */    private FcCompFont[] fontConfigFonts;    /**     * Instantiates a new FontConfigManager getting the default instance     * of FontManager from the FontManagerFactory.     */    public FontConfigManager() {    }    /* Called from code that needs to know what are the AA settings     * that apps using FC would pick up for the default desktop font.     * Note apps can change the default desktop font. etc, so this     * isn&#39;t certain to be right but its going to correct for most cases.     * Native return values map to the text aa values in sun.awt.SunHints.     * which is used to look up the renderinghint value object.     */    public static Object getFontConfigAAHint() {        return getFontConfigAAHint("sans");    }    /* This is public solely so that for debugging purposes it can be called     * with other names, which might (eg) include a size, eg "sans-24"     * The return value is a text aa rendering hint value.     * Normally we should call the no-args version.     */    public static Object getFontConfigAAHint(String fcFamily) {        if (FontUtilities.isWindows) {            return null;        } else {            int hint = getFontConfigAASettings(getFCLocaleStr(), fcFamily);            if (hint < 0) {                return null;            } else {                return SunHints.Value.get(SunHints.INTKEY_TEXT_ANTIALIASING,                        hint);            }        }    }    private static String getFCLocaleStr() {        Locale l = SunToolkit.getStartupLocale();        String localeStr = l.getLanguage();        String country = l.getCountry();        if (!country.equals("")) {            localeStr = localeStr + "-" + country;        }        return localeStr;    }    /* This does cause the native libfontconfig to be loaded and unloaded,     * but it does not incur the overhead of initialisation of its     * data structures, so shouldn&#39;t have a measurable impact.     */    public static native int getFontConfigVersion();    /* This can be made public if it&#39;s needed to force a re-read     * rather than using the cached values. The re-read would be needed     * only if some event signalled that the fontconfig has changed.     * In that event this method would need to return directly the array     * to be used by the caller in case it subsequently changed.     */    public synchronized void initFontConfigFonts(boolean includeFallbacks) {        if (fontConfigFonts != null) {            if (!includeFallbacks || (fontConfigFonts[0].allFonts != null)) {                return;            }        }        if (FontUtilities.isWindows || fontConfigFailed) {            return;        }        long t0 = 0;        if (FontUtilities.isLogging()) {            t0 = System.nanoTime();        }        FcCompFont[] fontArr = new FcCompFont[fontConfigNames.length];        for (int i = 0; i< fontArr.length; i++) {            fontArr = new FcCompFont();            fontArr.fcName = fontConfigNames;            int colonPos = fontArr.fcName.indexOf(&#39;:&#39;);            fontArr.fcFamily = fontArr.fcName.substring(0, colonPos);            fontArr.jdkName = FontUtilities.mapFcName(fontArr.fcFamily);            fontArr.style = i % 4; // depends on array order.        }        getFontConfig(getFCLocaleStr(), fcInfo, fontArr, includeFallbacks);        FontConfigFont anyFont = null;        /* If don&#39;t find anything (eg no libfontconfig), then just return */        for (int i = 0; i< fontArr.length; i++) {            FcCompFont fci = fontArr;            if (fci.firstFont == null) {                if (FontUtilities.isLogging()) {                    PlatformLogger logger = FontUtilities.getLogger();                    logger.info("Fontconfig returned no font for " +                            fontArr.fcName);                }                fontConfigFailed = true;            } else if (anyFont == null) {                anyFont = fci.firstFont;            }        }        if (anyFont == null) {            if (FontUtilities.isLogging()) {                PlatformLogger logger = FontUtilities.getLogger();                logger.info("Fontconfig returned no fonts at all.");            }            fontConfigFailed = true;            return;        } else if (fontConfigFailed) {            for (int i = 0; i< fontArr.length; i++) {                if (fontArr.firstFont == null) {                    fontArr.firstFont = anyFont;                }            }        }        fontConfigFonts = fontArr;        if (FontUtilities.isLogging()) {            PlatformLogger logger = FontUtilities.getLogger();            long t1 = System.nanoTime();            logger.info("Time spent accessing fontconfig="                    + ((t1 - t0) / 1000000) + "ms.");            for (int i = 0; i< fontConfigFonts.length; i++) {                FcCompFont fci = fontConfigFonts;                logger.info("FC font " + fci.fcName+" maps to family " +                        fci.firstFont.familyName +                        " in file " + fci.firstFont.fontFile);                if (fci.allFonts != null) {                    for (int f=0;f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )