`
weitao1026
  • 浏览: 1053501 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

import语句只在编译时有效

 
阅读更多

其实import了之后没用的话跟JVM啊classloader什么的完全没关系。
import语句只在编译时有效,编译过后不会带到class文件里的。所以import了之后用了的类的信息才会出现在编译出来的class文件里,没用的则不会出现。

有兴趣可以自己动手试试。

Java代码 复制代码 收藏代码
  1. //import java.util.regex.*;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println("test");  
  6.     }  
  7. }  
//import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        System.out.println("test");
    }
}



那行import无论被注释掉还是没有被注释掉,编译出来的class文件的内容都是这样的:(javap -private -s -verbose Test)

Java代码 复制代码 收藏代码
  1. Compiled from "Test.java"  
  2. public class Test extends java.lang.Object  
  3.   SourceFile: "Test.java"  
  4.   minor version: 0  
  5.   major version: 50  
  6.   Constant pool:  
  7. const #1 = Method   #6.#15//  java/lang/Object."<init>":()V  
  8. const #2 = Field    #16.#17;    //  java/lang/System.out:Ljava/io/PrintStream;  
  9. const #3 = String   #18;    //  test  
  10. const #4 = Method   #19.#20;    //  java/io/PrintStream.println:(Ljava/lang/String;)V  
  11. const #5 = class    #21;    //  Test  
  12. const #6 = class    #22;    //  java/lang/Object  
  13. const #7 = Asciz    <init>;  
  14. const #8 = Asciz    ()V;  
  15. const #9 = Asciz    Code;  
  16. const #10 = Asciz   LineNumberTable;  
  17. const #11 = Asciz   main;  
  18. const #12 = Asciz   ([Ljava/lang/String;)V;  
  19. const #13 = Asciz   SourceFile;  
  20. const #14 = Asciz   Test.java;  
  21. const #15 = NameAndType #7:#8;//  "<init>":()V  
  22. const #16 = class   #23;    //  java/lang/System  
  23. const #17 = NameAndType #24:#25;//  out:Ljava/io/PrintStream;  
  24. const #18 = Asciz   test;  
  25. const #19 = class   #26;    //  java/io/PrintStream  
  26. const #20 = NameAndType #27:#28;//  println:(Ljava/lang/String;)V  
  27. const #21 = Asciz   Test;  
  28. const #22 = Asciz   java/lang/Object;  
  29. const #23 = Asciz   java/lang/System;  
  30. const #24 = Asciz   out;  
  31. const #25 = Asciz   Ljava/io/PrintStream;;  
  32. const #26 = Asciz   java/io/PrintStream;  
  33. const #27 = Asciz   println;  
  34. const #28 = Asciz   (Ljava/lang/String;)V;  
  35.   
  36. {  
  37. public Test();  
  38.   Signature: ()V  
  39.   Code:  
  40.    Stack=1, Locals=1, Args_size=1  
  41.    0:   aload_0  
  42.    1:   invokespecial   #1//Method java/lang/Object."<init>":()V  
  43.    4:   return  
  44.   LineNumberTable:   
  45.    line 30  
  46.   
  47.   
  48. public static void main(java.lang.String[]);  
  49.   Signature: ([Ljava/lang/String;)V  
  50.   Code:  
  51.    Stack=2, Locals=1, Args_size=1  
  52.    0:   getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;  
  53.    3:   ldc #3//String test  
  54.    5:   invokevirtual   #4//Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  55.    8:   return  
  56.   LineNumberTable:   
  57.    line 50  
  58.    line 68  
  59.   
  60.   
  61. }  
Compiled from "Test.java"
public class Test extends java.lang.Object
  SourceFile: "Test.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method	#6.#15;	//  java/lang/Object."<init>":()V
const #2 = Field	#16.#17;	//  java/lang/System.out:Ljava/io/PrintStream;
const #3 = String	#18;	//  test
const #4 = Method	#19.#20;	//  java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class	#21;	//  Test
const #6 = class	#22;	//  java/lang/Object
const #7 = Asciz	<init>;
const #8 = Asciz	()V;
const #9 = Asciz	Code;
const #10 = Asciz	LineNumberTable;
const #11 = Asciz	main;
const #12 = Asciz	([Ljava/lang/String;)V;
const #13 = Asciz	SourceFile;
const #14 = Asciz	Test.java;
const #15 = NameAndType	#7:#8;//  "<init>":()V
const #16 = class	#23;	//  java/lang/System
const #17 = NameAndType	#24:#25;//  out:Ljava/io/PrintStream;
const #18 = Asciz	test;
const #19 = class	#26;	//  java/io/PrintStream
const #20 = NameAndType	#27:#28;//  println:(Ljava/lang/String;)V
const #21 = Asciz	Test;
const #22 = Asciz	java/lang/Object;
const #23 = Asciz	java/lang/System;
const #24 = Asciz	out;
const #25 = Asciz	Ljava/io/PrintStream;;
const #26 = Asciz	java/io/PrintStream;
const #27 = Asciz	println;
const #28 = Asciz	(Ljava/lang/String;)V;

{
public Test();
  Signature: ()V
  Code:
   Stack=1, Locals=1, Args_size=1
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return
  LineNumberTable: 
   line 3: 0


public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   Stack=2, Locals=1, Args_size=1
   0:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:	ldc	#3; //String test
   5:	invokevirtual	#4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:	return
  LineNumberTable: 
   line 5: 0
   line 6: 8


}



所以别在意,import多余的东西不会对运行性能带来影响。JVM根本不知道你import了哪些类,只知道你用了哪些类。

import多余的东西主要带来的影响是污染了当前编译单元(也就是单个Java源代码文件)的命名空间而已,名字冲突的可能性变大了而已。例如说package A里有MyClass,你当前的文件在package B里,也有MyClass,这个时候直接写MyClass就容易有歧义,需要写成完整的A.MyClass或B.MyClass来区分。只是这个问题而已。

分享到:
评论

相关推荐

    Kotlin 包和 import 语句

    当两个或多个不同的包中含有相同名称的类时,直接使用 `import` 语句会导致编译错误。为了避免这个问题,可以使用 `as` 关键字来重命名导入的类。例如: ```kotlin import foo.a.Bar as ABar import foo.b.Bar as ...

    Java中import语句的测试代码清单.pdf

    在Java编程语言中,`import`语句是一个至关重要的部分,它允许我们引用其他类、接口或包,以便在我们的程序中使用它们。这个过程被称为“导入”或“导包”,使得代码更加简洁且易于管理。以下是关于Java `import`...

    javaSE的import要点和packet下类的编译和运行.doc

    总结,理解和熟练运用`import`语句以及在命令行环境中编译和运行带有包的Java类,是Java开发的基础技能。在编写代码时,合理地使用`import`可以提高代码的可读性和维护性。同时,正确地编译和运行程序,对于调试和...

    python和其第三方库交叉编译过程

    例如,可以使用 Python 的交互式 shell 来验证 Numpy 库是否安装成功,或者使用 import 语句来验证其他第三方库是否安装成功。 Python 和第三方库交叉编译过程需要meticulous 的准备工作、编译 Python 和第三方库,...

    JAVA预编译示例代码

    在预编译中使用 like 时,需要在值的地方加 % 号,以便正确地实现模糊查询。例如,String sql = "select * from t_Content where title like ?";ResultSet rs;rs = null;try {rs = db.getResult(sql, new String[]{...

    testImport.zip

    在Python中,`import` 语句有多种形式: 1. **基本导入**:`import module_name`,这会将整个模块导入,并允许通过 `module_name` 访问其所有公开属性(即非下划线开头的变量和函数)。 2. **别名导入**:`import ...

    JAVA100例之实例54 使用语句预处理

    例如,我们可以使用@ConditionalOnClass或@ConditionalOnBean等Spring Boot的注解,来确保某些组件只在类路径中有特定类或者存在特定bean的情况下才生效。 在"JAVA100例之实例54"中,可能包含了一个展示如何使用...

    详解webpack import()动态加载模块踩坑

    这意味着在封装高阶函数时,需要考虑路径的相对性,因为编译后的路径会变成 Webpack 命令执行目录的相对路径。这可能会导致路径解析的问题,需要在编写代码时格外留意。 总之,理解并正确使用 `import()` 动态加载...

    Java深入历险(CH_05.package_与import_机制)

    在初学者尝试学习Java编程时,经常会遇到的第一个难题就是如何理解`package`和`import`机制。这两个概念对于顺利编写并运行Java程序至关重要。本文将深入探讨这两个核心概念,并通过具体的例子帮助读者掌握它们。 #...

    protobuf导入定义(import)

    在protobuf中,“导入”(import)是一个关键概念,它允许你在一个.proto文件中引用另一个.proto文件中的定义。这样,你可以在多个文件之间共享消息类型、枚举或服务定义,避免代码重复,提高代码的可维护性和组织性...

    通过懒惰编译动态导入来提升webpack启动时间

    在这个例子中,`import()`表达式会异步加载`myModule.js`,只有当代码执行到这一行时才会发起请求并编译模块,而不是在应用启动时一次性加载所有模块。 Webpack支持动态导入,并且可以通过配置来优化这种加载方式。...

    import指令

    - **带引号的文件名**: 预处理器首先在包含 `#import` 语句的文件所在目录中搜索类型库文件,然后在编译器的其他指定路径中搜索。 - **带尖括号的文件名**: 预处理器会在环境变量 `PATH` 和 `LIB` 定义的路径中搜索...

    Java打印漂亮的SQL语句(被格式化的SQL语句)

    在Java编程中,调试SQL语句是开发过程中的常见任务,尤其当面对复杂且冗长的查询时。为了提高效率并使SQL语句更易于理解和分析,格式化SQL语句显得尤为重要。标题提及的"Java打印漂亮的SQL语句(被格式化的SQL语句)...

    import及Java类的搜索路径.docx

    4. 如果在所有指定的路径中都没有找到对应的类文件,则会出现编译错误或运行时错误。 #### 五、示例 假设有一个名为`Test`的类位于`p1`包中,并且`CLASSPATH`设置为`.;%JAVA_HOME%\lib`。当使用`import p1.Test;`...

    java-package与import机制

    在编译和运行Java程序时,系统需要知道去哪里寻找所需的类。`classpath`环境变量指定了这些类的位置。为了使程序能够找到`A.class`和`B.class`文件,我们需要确保它们位于`classpath`设置的目录中。 **4. 实际应用*...

    package和import的使用.pdf

    `import`语句位于所有类定义之前,且在`package`语句之后。需要注意的是,`import`只是告诉编译器类的位置,并不会将这些类的定义引入到代码中。对于`java.lang`包,其下的类如String、Integer等是默认导入的,无需...

    像import java类一样 import js类

    描述虽然为空,但我们可以推测博主可能分享了一个实现或一个工具,使JavaScript开发者可以以类似于Java的`import`语句来组织和引用他们的代码模块。这可能涉及到命名空间、模块管理和静态分析等方面。 标签“源码”...

    前端开源库-rollup-plugin-ignore-import

    `rollup-plugin-ignore-import`是一个Rollup插件,其主要任务是在打包时自动忽略开发者指定的导入语句。这可以显著减少最终输出文件的大小,提高加载速度,特别是在处理大型项目或库时。通过配置,你可以明确指定...

    详解如何在微信小程序中愉快地使用sass

    在处理import语句时,我们需要避免Sass将import的文件内容合并到当前文件中,因为这可能导致文件过大,超出微信小程序2MB的单包代码限制。有两种解决方法: 1. 修改Sass处理源码,跳过import语句。 2. 注释import...

    ABAP SQL 语句 动态 操作

    在ABAP编程中,SQL语句的动态操作是高级编程技术的一个重要方面,它允许根据程序运行时的条件和用户输入来构建和执行SQL查询。本程序“ZSQL_EXEC_RICOO”展示了如何使用ABAP实现动态SQL操作,包括SELECT、UPDATE、...

Global site tag (gtag.js) - Google Analytics