java底层学习

2023-10-27

额,马上就要面试了,java的底层肯定是需要了解的。网上找了找java的底层文章,做个记号。java底层主要是类的加载、连接和初始化。

本文主要分为四个方面:

(1)java底层概述

(2)new和newInstance()方法的区别

(3)深入探讨java的加载机制

(4)一个完整java程序冲java xxx.class执行的完整过程

四个部分都是来自网上的资料,四个部分看完,应该对java的底层有些了解了。

下面文字来自《疯狂java讲义》:

1.类的加载、连接和初始化

当系统主动使用某个类,如果该类还未加载到内存中,系统会加载、连接、初始化三个步骤。
1.类的加载将类的Class文件读入内存中,并为之创建一个java.lang.Class对象。
Class文件的来源:
(1)从本地加载class文件
(2)从jar包中加载(系统api)
(3)从网络加载
2.类的连接:
连接阶段负责将类的二进制数据合并到JRE中。
3.类的初始化
类的初始化时机:
(1)创建类的实例:new操作符、反射创建实例、通过反序列化;
(2)调用某个类的静态方法;
(3)访问某个类的静态属性(final属性除外)

2.new操作符和newInstance()方法的区别

http://lvqingboy-163-com.iteye.com/blog/657599

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

    Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
    class c = Class.forName(“Example”);
    factory = (ExampleInterface)c.newInstance();

    其中ExampleInterface是Example的接口,可以写成如下形式:
    String className = "Example";
    class c = Class.forName(className);
    factory = (ExampleInterface)c.newInstance();

    进一步可以写成如下形式:
    String className = readfromXMlConfig;//从xml 配置文件中获得字符串
    class c = Class.forName(className);
    factory = (ExampleInterface)c.newInstance();

    上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

    从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。

    现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

    最后用最简单的描述来区分new关键字和newInstance()方法的区别:
    newInstance: 弱类型。低效率。只能调用无参构造。
    new: 强类型。相对高效。能调用任何public构造。

我的理解:

其实,newInstance()方法是显式加载

Class 类的 forName (String s)方法把自定义类 TestClass 加载进来,并通过 newInstance ()方法把实例初始化

new操作符是隐式加载:JRE在执行到 new 关键字的时候就会把对应的实例类加载进入内存。

3.深入讨论java的类加载器机制

http://www.blogjava.net/William/archive/2006/08/25/65804.html

Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 Class 和接口 Implements 编译成单独的一个 . class 文件,这些文件对于 Java 运行环境来说就是一个个可以动态加载的单元。正是因为 Java 的这种特性,我们可以在不重新编译其它代码的情况下,只编译需要修改的单元,并把修改文件编译后的 . class 文件放到 Java 的路径当中,等到下次该 Java 虚拟机器重新激活时,这个逻辑上的 Java 应用程序就会因为加载了新修改的 .class 文件,自己的功能也做了更新,这就是 Java 的动态性。

下面用一个简单的例子让大家对 Java 的动态加载有一个基本的认识:

class TestClassA{
         publicvoid method(){
                   System.out.println("LoadingClassA");
         }

}
public class ClassLoaderTest {
         publicstatic void main(String args[]){
                   TestClassAtestClassA = new TestClassA();
                   testClassA.method();
         }

} 


编译后输入命令: java -verbose:class ClassLoaderTest ,执行文件。 (java-verbose:class:查看class的加载情况)

输出结构如图 (1)

图( 1 )

从运行结果我们可以看到, JRE ( JavaRuntime Environment )首先加载 ClassLoaderTest文件,然后再加载 TestClassA 文件,从而实现了动态加载。

 

1. 预先加载与依需求加载

Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。

当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE , JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存,这些文件是 Java 程序执行所必须的,所以系统在开始就将这些文件加载,避免以后的多次 IO 操作,从而提高程序执行效率。

图( 2 )我们可以看到多个基础类被加载, java.lang.Object,java.io.Serializable 等等。

图( 2 )

相对于预先加载,我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法( load-on-demand ),就是在 Java 程序需要用到的时候再加载,以减少内存的消耗,因为 Java 语言的设计初衷就是面向嵌入式领域的。

在这里还有一点需要说明的是, JRE 的依需求加载究竟是在什么时候把类加载进入内部的呢?

我们在定义一个类实例的时候,比如 TestClassA testClassA ,这个时候 testClassA 的值为 null ,也就是说还没有初始化,没有调用 TestClassA 的构造函数,只有当执行 testClassA = new TestClassA() 以后, JRE 才正真把TestClassA 加载进来。

 

2.隐式加载和显式加载

隐式加载:使用new操作符;

显示加载:使用forname()方法:Class 类的 forName (String s) 方法把自定义类 TestClass 加载进来,并通过 newInstance ()方法把实例初始化

Java 的加载方式分为隐式加载( implicit)和显示加载( explicit ),上面的例子中就是用的隐式加载的方式。所谓隐式加载就是我们在程序中用 new 关键字来定义一个实例变量, JRE 在执行到 new 关键字的时候就会把对应的实例类加载进入内存。隐式加载的方法很常见,用的也很多, JRE 系统在后台自动的帮助用户加载,减少了用户的工作量,也增加了系统的安全性和程序的可读性。

相对于隐式加载的就是我们不经常用到的显示加载。所谓显示加载就是有程序员自己写程序把需要的类加载到内存当中,下面我们看一段程序:

class TestClass{
         publicvoid method(){
                   System.out.println("TestClass-method");
         }
}

 

public class CLTest {
         publicstatic void main(String args[]) {
                  try{
                            Classc = Class.forName("TestClass");
                            TestClassobject = (TestClass)c.newInstance();
                            object.method();
                   }catch(Exceptione){

                            e.printStackTrace();
                   }

         }

} 


我们通过 Class 类的 forName (String s) 方法把自定义类 TestClass 加载进来,并通过 newInstance ()方法把实例初始化。事实上 Class 类还很多的功能,这里就不细讲了,有兴趣的可以参考 JDK 文档。

Class 的 forName() 方法还有另外一种形式:Class forName(String s, boolean flag, ClassLoader classloader) , s 表示需要加载类的名称,flag 表示在调用该函数加载类的时候是否初始化静态区, classloader 表示加载该类所需的加载器。

forName (String s) 是默认通过ClassLoader.getCallerClassLoader() 调用类加载器的,但是该方法是私有方法,我们无法调用,如果我们想使用 Class forName(String s, boolean flag, ClassLoader classloader) 来加载类的话,就必须要指定类加载器,可以通过如下的方式来实现:

Test test = new Test();//Test 类为自定义的一个测试类;

ClassLoader cl = test.getClass().getClassLoader();

                                                                           //获取 test 的类装载器;

Class c =Class.forName("TestClass", true, cl);

因为一个类要加载就必需要有加载器,这里我们是通过获取加载 Test 类的加载器 cl 当作加载 TestClass 的类加载器来实现加载的。

 

3. 自定义类加载机制

之前我们都是调用系统的类加载器来实现加载的,其实我们是可以自己定义类加载器的。利用 Java 提供的 java.net.URLClassLoader 类就可以实现。下面我们看一段范例:

                 

try{

                            URLurl = new URL("file:/d:/test/lib/");

                            URLClassLoaderurlCL = new URLClassLoader(new URL[]{url});

                            Classc = urlCL.loadClass("TestClassA");

                            TestClassAobject = (TestClassA)c.newInstance();

                            object.method();

                   }catch(Exceptione){

                            e.printStackTrace();

                   }


我们通过自定义的类加载器实现了 TestClassA 类的加载并调用 method ()方法。分析一下这个程序:首先定义 URL 指定类加载器从何处加载类, URL 可以指向网际网络上的任何位置,也可以指向我们计算机里的文件系统 ( 包含 JAR 文件 ) 。上述范例当中我们从 file:/d:/test/lib/ 处寻找类;然后定义 URLClassLoader 来加载所需的类,最后即可使用该实例了。

 

4. 类加载器的阶层体系

讨论了这么多以后,接下来我们仔细研究一下 Java 的类加载器的工作原理:

当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。

下面的图形可以表示三者之间的关系:

父类

父类

载入

载入

BootstrapLoader

       PARENT

AppClassLoader

PARENT

ExtClassLoader

这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:

BootstrapLoader :      sun.boot.class.path

ExtClassLoader:                java.ext.dirs

AppClassLoader:               java.class.path

这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。

 

5. 总结

了解 Java 的类加载机制对我们熟练灵活运用 Java 语言,提高程序的运行效率有着非常重要的作用,知其然也要知其所以然,这样才能从整体提高程序的质量。


4.深入java底层

http://bigwhite.blogbus.com/logs/579744.html

在一个朋友的书架上发现王森著的《Java深度历险》一书,看了书的前言了解该书是关于Java底层技术内幕的。怀着好奇心浏览了一下,谈不上有太多收获,但也记下了一些自认为有益的两点。

Java xxx

我们在命令行下敲入:“java xxx”后会发生什么呢?

流程如下:

 

1.        找到JRE;

 

2.        找到JVM.dll;

 

3.        启动JVM,并进行初始化;

 

4.        产生Bootstrap Loader;

 

5.        载入ExtClassLoader;(Ext – Extended)

 

6.        载入AppClassLoader;

 

7.        加载xxx类。

 

书中提到Bootstrap Loader、ExtClassLoader和AppClassLoader构成了Java的“类加载器继承体系--class loader hierarchy”,其中BootstrapLoader是由C++编写的,其他两个是由Java写的。之所以成为“继承体系”是因为这三个loader之间是有联系的。Bootstrap Loader负责加载ExtClassLoader,后者ExtClassLoader就将其parent置为Bootstrap Loader。AppClassLoader较为特殊,虽然由Bootstrap载入,但是其parent却置为ExtClassLoader。其原因是为了实现“委托模型”。简述“委托模型”就是当类加载器有加载类的需求时,会先请求其parent使用其搜索路径帮助加载,如果其parent找不到,才使用自己的搜索路径进行加载。如上述所说当ExtClassLoader想载入AppClassLoader类时它首先请求其parent “Bootstrap Loader”帮忙,Bootstrap Loader将AppClassLoader载入后,由于这个载入是ExtClassLoader请求的,所以AppClassLoader的parent还是置为ExtClassLoader而不是Bootstrap Loader。

类的加载流程

类加载的时候遵循一个原则:“类加载器会依类的继承体系从上至下依次加载”。举个例子:“如果C继承了B并实现了接口I,而B有继承自A”,则类加载器在加载C时,加载的次序会是A-> B->I->C,(注:interface会如同class一样被Java编译器编译为独立的.class文件)

其实我对底层的东西并未给与太多的关注,如果在哪个项目中需要我去了解底层的话,我会去很好的学习。

 

额,顺便看看什么事DLL

http://baike.baidu.com/view/887.htm

动态链接库英文为DLL,是DynamicLink Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java底层学习 的相关文章

  • 在 Java 中重新抛出异常而不丢失堆栈跟踪

    在 C 中 我可以使用throw 语句重新抛出异常 同时保留堆栈跟踪 try catch Exception e if e is FooException throw Java中有没有类似的东西 不会丢失原始堆栈跟踪 catch Whate
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • 是否有适用于 Java 的 Harel Statechart DSL 工具?

    我正在寻找一种能够理解 DSL 的工具 在其中我可以定义生成 Java 代码的状态图 或者 DSL 中的状态图可以按原样运行 该工具最好用 Java 编写 并且必须根据 Harel 状态图 或等效的 UML 2 状态机 的定义支持超级状态和
  • ActiveMQ 桥连接器到 WebSphereMQ 而不使用 XML 配置

    我想在嵌入式代理中创建一个代理来代理 ActiveMQ 和 WebSphere MQ 之间的连接 我知道 activemq 中存在网络连接器来执行此操作 代理到代理 但我不知道如何配置它以连接到 WebSphere MQ 在网络上进行搜索时
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 对 Java Servlet 进行单元测试

    我想知道对 servlet 进行单元测试的最佳方法是什么 只要内部方法不引用 servlet 上下文 测试内部方法就不是问题 但是测试 doGet doPost 方法以及引用上下文或使用会话参数的内部方法呢 有没有办法简单地使用经典工具 例
  • Vaadin:在表中显示列表

    我需要显示表中列表中包含的所有值 例如 class Person String name String age List
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • 自 Java 7 以来 HttpServer 延迟 1 秒

    我们正在使用内部HttpServer项目中的类 用于通过 HTTP 在客户端和服务器之间交换数据 当我们切换到 Java 7 时 我们意识到结果交付存在延迟 我们可以将问题简化为以下示例 Class EchoServer创建上下文 echo
  • ImageIO read() 和 write() 操作后 GIF 图像变得错误

    我有这个代码 它只是读取 GIF 文件 用背景重新绘制它 然后输出到新的 GIF 文件 问题是结果文件变得奇怪 我不知道为什么它的质量变得很差 JPG 文件不会出现此问题 如何修复它 import java awt Color import
  • Java Swing 组件的命名约定(前缀)

    在 Java 中使用 Swing 进行编程时 我想到的一个问题是 它是 Swing 组件的推荐还是 官方 最常用的命名约定 前缀 例如 尽管其他人可能更喜欢其他命名约定 但这就是我当前正在使用的 JTextField 的 txt JButt
  • javax.validation 的 @AssertTrue - 它不应该创建错误消息吗?

    我在 Spring MVC 命令 bean 中有以下代码 AssertTrue public boolean isConditionTrue return false private boolean conditionTrue 我的 JSP
  • 错误:libXext.so.6:无法打开共享对象文件:没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 运行尝试打开 ods 文件的 java 文件时出现以下错误 线程 main 中出现异常 java lang UnsatisfiedLinkError opt software jdk1 6 0 45 jre li
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • AWS Java SDK 中 DynamoDB v2 的迁移详细信息?

    有没有人对新的命名空间进行了更改 com amazonaws services dynamodbv2 以及 AWS Java SDK 1 4 2 及更高版本 中 DynamoDB 的接口 本地二级指数的发布显然需要根据1 4 2 发行说明
  • java.lang.Object#getClass() 的 Eclipse 外部空注释

    我正在使用 Eclipse Mars 中提供的外部空注释工具 我正在尝试添加外部注释java lang Object getClass 但似乎无法正确签名 我尝试过以下变体 NonNull Class getClass L1java lan
  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise

随机推荐

  • 多处理器架构

    多处理器架构是一种计算机体系结构 它具有多个处理器或中央处理单元 CPU 这些处理器可以同时处理多个任务和数据 多处理器架构可以大大提高计算机的性能和吞吐量 特别是在需要处理大量数据和高度并发的应用程序中 在现代计算机系统中 多处理器架构已
  • UE4 C++ 对结构体数组内元素进行排序

    对结构体数组排序需要两个必要条件 一是结构体定义内重写 lt 操作符 二是元素内必须要有可以用来排序的属性例如int float类型的变量 案例 h UENUM BlueprintType enum class EOrient uint8
  • React Native 技术选型分析

    本文从技术决策讲起 聊聊我们为什么要使用 React Native 如何使用 以及其他维度的思考 文中将用 RN 代表 React Native 1 技术选型决策 技术选型是一个复杂的过程 必须谨慎并保持敬畏 需要根据项目的实际情况而定 这
  • LeetCode 多线程1116. 打印零与奇偶数

    题目https leetcode cn com problems print zero even odd 首先判断奇数偶数 num 1 0 为奇数 可以通过信号量Semaphore来求 class ZeroEvenOdd private i
  • 设计模式之Builder模式(链式调用)

    问题背景 Builder模式在很多地方都有用到 代码风格也比较简洁 但是对其深入的了解并不多 因此在参考其他博客的基础上写此文章 首先先看我的实际应用到Builder模式的场景 场景一 这是在编写RPC简易框架时 需要输入服务端的配置信息时
  • OA 系统工作流引擎 Camunda 实践(1)

    审核人员看清楚再审核 我是把自己公司的案例分析一下 这哪是广告 Camunda是Activiti最大的贡献者之一 除Alfresco以外 同时也是它一个主 要的执行咨询合作伙伴 camunda表示Activiti可能太拘束于Alfresco
  • VMware vCenter Server 8.0安装并添加ESXi 7.0主机(含ESXi 6.7版本升级至7.0版本)

    目录 一 VMware vSphere虚拟化方案名词梳理 1 VMware Workstation 虚拟化工具 2 VMware vSphere 虚拟化方案 2 1 ESXi 裸金属架构的虚拟化技术 2 2 vCenter Server 批
  • # DevOps名词定义梳理

    DevOps名词定义梳理 极限编程座右铭 如果它令你很受伤 那么就做更多的练习 If it hurts do it more often 经常人们会把这些名词用错 构建 就是把源代码制成成品的过程 这个过程一般会有单元测试 集成 将各个项目
  • Python3.7 Scrapy 提示def write(self,data,asyc) 语法错误

    Scrapy 执行爬虫任务 提示如下错误信息如下 from twisted conch import manhole telnet File D python3 6 Lib site packages twisted conch manho
  • es中修改索引名称命令_在Elasticsearch中更改索引名称

    es中修改索引名称命令 嘿 今天 我碰巧写了一个脚本来解决一个看起来很多人都面临的特定问题 重命名给定的Elasticsearch索引 自然地 有记录在案的解决方案 但是我没有Swift找到一个脚本可以让我找到我想要的位置 来自索引a所有数
  • Latex 字体加粗

    textbf w 显示为 w textbf w w
  • mysql数据库datetime字段转换成java中Date类型

    最终代码展示 输出Account类型对象 使用ResultSet类中的getDate方法只能获取到获取到日期不能得到时间 使用ResultSet类中的getTime方法只能获取到获取到时间不能得到日期 使用ResultSet类中的getTi
  • Java 开发中常见的异常有哪些?

    1 空指针异常 NullPointException 当对象不存在 却又去调用对象的属性或方法时 就会出现该异常 2 数组越界异常 ArrayIndexOutOfBoundsException 当数组只存在5个元素 他们所对应的的下标即为0
  • MySQL显示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)解决方法

    MySQL显示ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 解决方法 第一步 在win快捷键下已管理员身份启动cmd命令然后进入mysql安装目录下的bi
  • 10信号学习之signal函数及使用其实现信号捕捉案例

    1 signal函数 功能 该函数注册一个信号捕捉函数 对比上一篇的案例和相关函数 都是针对于信号集操作的 而这个函数是针对处理动作来操作的 你可以利用此函数将捕捉到的信号按自己的方式执行 例如你可以捕捉段错误的信号后执行打印hello w
  • STM32无法下载程序

    新研发了一块STM32板 MCU使用的是STM32F4 前期硬件测试都是正常的 电源等各项硬件指标都是正常的 但是在下载程序测试的时候出现了问题 板子只能下载第一次程序成功 第二次就不能识别芯片 无法下载程序 貌似MCU被锁死 检查原理图并
  • warning: unknown attribute ‘at‘ ignored [-Wunknown-attributes] keil报错处理

    背景在KEIL v6版本编译 attribute at 语句 const unsigned char vis sensor fw attribute at 0X0800C800 0x98 0x14 0x00 0x20 0x65 0x01 0
  • java Spring调试 ApplicationContext cannot be resolved to a type

    今天开发过程中遇到了不能识别导入的Spring jar包的情况 ApplicationContext cannot be resolved to a type 本人分析情况为两种 1 导入的包错误 2 本人遇到的情况 就是jre版本过高 将
  • RawImages图片加载方式

    using UnityEngine using UnityEngine UI public class RawImagesExtend MonoBehaviour Header 资源加载方式 public SourceMode source
  • java底层学习

    额 马上就要面试了 java的底层肯定是需要了解的 网上找了找java的底层文章 做个记号 java底层主要是类的加载 连接和初始化 本文主要分为四个方面 1 java底层概述 2 new和newInstance 方法的区别 3 深入探讨j