java基础源码分析_java代码分析

hacker|
121

文章目录:

如何研究Java的一些框架源码

基本的思路就是先将源码构建出来,并且是可以运行的。比如CAS和activemq直接就是可以运行的。比如spring可以构建一个使用spring引用的web工程,然后去掉spring相应的jar包,改成spring的源码依赖。简言之就是能让源码跑起来。这样才能打断点,跟踪调试。

再往下就是核心部分了。

首先,最好是熟悉这个产品和框架的使用。如果都不会用就去看源码,会有很多地方理解不上去。所以一定要会用。不用每一个细节都会用,至少整体的工作流程要明白。

其次就是对于他包含了那几个部分有所了解,比如一个一个应用可能会有容器类,存储部分,网络通讯部分等组成,对整体框架结构要有所了解。

再次之就是可以提前找一些该框架深入的源码分析作为辅助理解看看。

最后就是看源码细节了。

一般来说,一个产品中都有几个做类似事情 的不同实现。比如activemq,有多个持久层的实现,包括jdbc,kahadb还有内存存储等。一般你抓住一个你最常用方式,比如jdbc看就好。其他的存储方式都是相同的存储接口的实现。

java源代码分析 实在是不太会,求高手教教我。

package test2;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

public class JavaCodeAnalyzer {

    public static void analyze(File file) throws IOException{

        //FileOutputStream fos = new FileOutputStream("F;"+File.separator+"result.txt");

        if(!(file.getName().endsWith(".txt")||file.getName().endsWith(".java"))){

            System.out.println("输入的分析文件格式不对!");

        }

        InputStream is= new FileInputStream(file);

        BufferedReader br= new BufferedReader(new InputStreamReader(is));

        String temp;

        int count=0;

        int countSpace=0;

        int countCode=0;

        int countDesc=0;

        MapString, Integer map = getKeyWords();

        while((temp=br.readLine())!=null){

            countKeys(temp, map);

            count++;

            if(temp.trim().equals("")){

                countSpace++;

            }else if(temp.trim().startsWith("/*")||temp.trim().startsWith("//")){

                countDesc++;

            }else{

                countCode++;

            }

        }

        System.out.printf("代码行数:"+countCode+"占总行数的%4.2f\n",(double)countCode/count);

        System.out.printf("空行数:"+countSpace+"占总行数的%4.2f\n",(double)countSpace/count);

        System.out.printf("注释行数:"+countDesc+"占总行数的%4.2f\n",(double)countDesc/count);

        System.out.println("总行数:"+count);

        System.out.println("出现最多的5个关键字是:");

        System.out.println("");

        System.out.println("");

        System.out.println("");

        System.out.println("");

        System.out.println("");

    }

    public static void main(String[] args) {

        getKeyWords();

        File file = new File("F://Test.java");

        try {

            analyze(file);

        } catch (IOException e) {

            // TODO 自动生成 catch 块

            e.printStackTrace();

        }

    }

    public static MapString,Integer getKeyWords(){

        MapString,Integer map = new HashMapString, Integer();

        String[]keywords = {"abstract","assert","boolean","break","byte","case","catch","char","class","continue","default","do","double","else","enum","extends","final","finally","float","for","if","implements","import","instanceof","int","interface","long","native","new","package","private","protected","public","return","    strictfp","short","static","super","    switch","synchronized","this","throw","throws","transient","try","void","volatile","while","goto","const"};

        for(String s:keywords){

            map.put(s, 0);

        }

        return map;

    }

    public static void countKeys(String s,MapString,Integer map){

        SetString keys = map.keySet();

        for(String ss:keys){

            if(s.indexOf(ss)!=-1){

                map.put(ss, map.get(ss)+1);

            }

        }

    }

}

上班没啥时间了,还有点没写完,你在想想。

java源码分析,最好的解答,应该最好逐句解答,这句什么要这样写,为什么不哪样写,看的人一样就看懂了。

但是如果连程序最基本的元素——标识符、关键字、……等等的都没有了解的话,那么最先开始看实例是比较困难的,哪怕是逐句解释。当然了,可以把概念放到实例中讲解,但是这样一来大量概念和其它信息的相互关联,未必能让初学者在一开始就理解实例程序。

我也觉得结合实例的基础讲解比价好,只是不能一味全部是实例,当然也不能全部是概念,要相互结合,适当地概括和总结。

Java大神如何学习和分析Java框架的源码

1、拿到代码查看项目当中是否有readme这样的文件,如果没有查看是否有文档之类的

2、代码当中没有文档,那么就想你的同事或者其他人要这个框架的介绍或者资料

3、先请教别人这个框架的大体思路

4、自己独立去按照文档或者其他人说的思路去看代码

5、不懂的地方全部记录下面,一次行去问,有的时候很多问题在你看到后面的东西的时候就自然明白了

6、看懂了代码之后自己尝试着写一个,看自己的理解是否正确就这么多了。

3条大神的评论

  • avatar
    访客 2022-07-16 下午 10:06:45

    do","double","else","enum","extends","final","finally","float","for","if","implemen

  • avatar
    访客 2022-07-16 下午 10:21:45

    am is= new FileInputStream(file);        BufferedReader br= new BufferedReader(new InputStreamReader(is));     

  • avatar
    访客 2022-07-17 上午 07:49:00

    System.out.println("总行数:"+count);        System.out.println("出现最多的5个关键字是:");        Sys

发表评论