`
sudongyuan
  • 浏览: 59363 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

main()方法的执行 和 类加载

阅读更多

存在这么一个类:

public class test2 {
    
           public int noStaticNum = printNoStaticNum();  
             
           public static  int staticNum = printStaticNum();  
           
           public static final int aaa = 111 ;
           
           public final int bbb = 222 ;
           
           static {  
               System.out.println("执行静态块!");  
           }  
            
          public static int printStaticNum() {  
              System.out.println("execute printStaticNum() method !");  
              return 1;  
          }  
            
          public int printNoStaticNum() {  
              System.out.println("execute printNoStaticNum() method !");  
              return 1;  
          }  
            
          public static void main(String[] args) {  
             
          }  
      }

 

1、类的实例化 test2 t1 = new test2() ;

实例化的结果是打印:

execute printStaticNum() method !
执行静态块!
execute printNoStaticNum() method !

 

实例化过程其实分开了说有两个过程:类加载和实例化的过程

类加载的过程大概包括以下过程(详情可以参考深入JVM这本书):

           * 1、把字节码文件转换为二进制文件
           * 2、在方法区中形成内部数据结构.(类中局部变量、方法、父类引用等)
           * 3、验证类文件中数据合法性
           * 4、初始化的过程(主要给静态变量和静态块初始化)

实例化的过程包括:

          * 1、实例化主要的工作是在内存堆中生成一个对象实例
          * 2、生成的实例会进行内部局部变量的初始化等

 

进行运行结果的验证:

直接执行这个类的结果是:

execute printStaticNum() method !
执行静态块!

可以发现运行main()并没有对局部变量进行初始化,那么是否运行main()没有实例化呢?内存中是否存在test2的对象呢?如果存在,又是一个什么样的形态呢?今天没时间了,以后验证吧!

 

2、Class.forName()和newInstance()

Class.forName()方法是加载的过程

newInstance()是一个实例化的过程

 

//利用默认的构造器生成对象
 test2 t2 = (test2)Class.forName("com.sudongyuan.test2").newInstance();

//如果类中有多个构造器可以选择相应的构造器生成对象
test2 t3 = (test2)Class.forName("com.sudongyuan.test2").getConstructors()[0].newInstance("");

 

3、反射机制,利用方法名调用对象方法

         Class a = Class.forName("com.sudongyuan.test2") ;
          Method b = a.getMethod("printNoStaticNum",null);
          b.invoke(a.newInstance(), null);

 

4、验证静态变量和非静态变量的区别(还有final变量)

         /* 验证静态变量和非静态变量的区别
           * 1、静态变量是所有的类实例共享,其中一个实例对其进行了修改会在别的类实例中反映出来
           * 2、非静态变量是实例独享,对其的改动不会反映到别的对象中
           * 3、final变量不能进行重新附值,所以在使用中final int a = 0 和final static int a = 0
           * 应该是一样的。区别是
           * */
          test2 f = (test2)a.newInstance() ;
          f.staticNum = 99000 ;
          f.noStaticNum = 29999 ;        

System.out.println(((test2)a.newInstance()).staticNum + " " + ((test2)a.newInstance()).noStaticNum );

打印的结果是:99000   1

 

类中有这两个final变量

   public static final int aaa  ;  
   public final int bbb  ;

 

对static final aaa,根据有的书中介绍说在编译时候就会把aaa转换为常量定义形式,但是在编译后的Class文件中,aaa并没有转换(这个还有待以后验证)。

那么aaa和bbb有什么区别呢?根据static的区别,是不是aaa是所有实例共享呢?

但是既然是常量,那么就无所谓共享不共享了。因为所有aaa都是相同的值。所以,aaa和bbb在使用上是完全一样的了。

只不过bbb是对象实例私有的,存放在堆空间的对象中,而aaa则是和一般的static一样存放在方法区中,以待对象的调用,加了一层限制,不允许调用的对象改变值罢了。

 

分享到:
评论

相关推荐

    Linux上执行带main方法的java文件

    这里需要注意的是命令中的`-jar`选项,它告诉Java运行时环境去读取该文件的`manifest.mf`文件,并从中找出`Main-Class`,然后执行该类的`main`方法。 #### 总结 通过上述步骤,可以在Linux环境下顺利地执行含有`...

    __main函数内幕——从加载视图到执行视图.pdf

    链接器arm link在生成可执行文件的同时生成的链接地址映射文件,如`at91sam9261-sdram.map`,提供了关于映像文件的全面信息,包括但不限于符号链接地址、加载区和执行区的基址、大小和内容。这些信息对于理解和调试...

    bat 运行java main方法

    首先,确保你有一个已经打包好的`jar`文件,这个文件包含了你的Java类和对应的`main`方法。`jar`文件是Java的归档文件,它将多个类文件打包在一起,便于分发和运行。例如,在你的压缩包`builds`中可能包含这样的`jar...

    java 类加载器 加密

    在“java 类加载器 加密”这个主题中,我们将探讨如何利用类加载器实现类的加密和解密,以及如何通过反射执行main方法。 首先,我们理解一下类加载器的工作原理。Java中的类加载器主要有三种:Bootstrap ...

    反射,动态加载指定类调用类中的方法

    在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class<?>`: 这是所有Java类的通用表示,通过`Class....

    java面试题静态加载顺序构造方法

    2.我们发现main()方法在X类中,要执行main()方法,还得先将X类加载到内存中。 3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就...

    Java类加载器.pdf

    它不仅管理类的生命周期,还确保了类的正确加载和初始化,是Java动态特性的基石。 #### 类加载器的工作原理 Java类加载器遵循按需加载原则,即只有当应用程序真正需要使用某个类时,类加载器才会去加载它。这一...

    java类加载机制

    4. **符号引用验证**:确保符号引用中描述的类、字段和方法确实存在且可访问。 ##### 2.3 准备 准备阶段为类变量分配内存并设置初始值,这些变量的内存位于方法区。需要注意的是,在准备阶段: - 只为类变量分配...

    java应用程序类加载器,ClassLoader for java Application

    它查找并加载包含主类(Main-Class manifest属性指定的类)的jar文件,然后执行`main`方法。与exe4j等工具相比,应用程序类加载器提供了一种更标准、跨平台的方式来启动Java程序。通过配置类路径,开发者可以自定义...

    main方法分析1

    `main`方法的调用通常是以`ClassName.main(args)`的形式,但这并不意味着`static`方法一定会在类加载时执行。JVM会在运行时根据程序的需求调用`main`方法,而不会自动执行其他`static`方法。至于`xxx.main`的调用,...

    JAVA类加载机制与动态代理

    5. **初始化(Initialization)**:这是类加载过程的最后一步,主要是执行类构造器`()`方法的过程。`()`方法由编译器自动收集类中的所有类变量的初始化语句和静态初始化块中的语句合并产生的。该方法用于为类变量...

    java类加载机制原理与实现

    1. 加载(Loading):在硬盘上查找并通过 IO 读入字节码文件,使用到类时才会加载,例如调用类的 main() 方法,new 对象等等。在加载阶段会在内存中生成一个代表这个类的 java.lang.Class 对象。 2. 验证...

    关于Java类加载器的探讨.pdf

    3. 系统类加载器:负责加载classpath中的类,也就是执行Java MainClass时加载MainClass的加载器。系统类加载器使用Java实现,使用很广泛,负责加载classpath中的类。 二、类加载器之间的关系 类加载器之间存在继承...

    windows下bat文件调用java的main方法

    最近项目需要,自己根据网上找的代码,自己改了一下,主要是把jar包的加载改成了循环加载,而不是一句句写。亲测可用。

    JavaMain如何被执行?Java开发Java经验技巧共

    2. **加载**:然后,JVM加载包含`main`方法的类。类加载器会查找并加载对应的`.class`文件。 3. **验证**:JVM会验证加载的字节码是否符合Java语法规则和安全规范。 4. **解析**:JVM将符号引用转换为直接引用,...

    Java虚拟机JVM类加载初始化

    主动使用是指类加载的触发条件,包括创建类实例、访问静态变量、调用静态方法、反射调用、初始化子类以及执行主类的`main`方法。其他情况,如通过类加载器获取类信息,被视为被动使用,不会触发类初始化。 5. 类...

    反射机制和类加载机制学习总结

    反射提供了强大的运行时元数据操作能力,而类加载机制则确保了类的安全加载和动态管理。深入理解这两个机制对于Java开发者来说至关重要,尤其对于那些从事框架开发和系统级编程的开发者而言更是如此。

    jar包中类的加载及jar中资源的使用

    在Java编程环境中,`jar`(Java Archive)文件是一种打包工具,它将多个类文件、资源文件以及其他元数据集合在一起,便于分发和执行。本文将深入探讨`jar`包中类的加载机制以及如何在Java程序中使用`jar`中的资源。 ...

    JAVA-JVM-01类加载机制

    此外,用户还可以自定义类加载器,继承`java.lang.ClassLoader`,并重写`loadClass()`和`findClass()`方法来实现特定的类加载逻辑。例如,自定义类加载器可以指定从特定目录或网络加载类。 双亲委派机制是Java类...

    利用类装载器动态加载类并启动类

    通过上述步骤,我们可以有效地利用位移和非运算算法对文件进行加密和解密,并通过自定义类装载器实现了解密后类的动态加载和启动。这种方式不仅增强了数据的安全性,也为动态加载类提供了灵活的解决方案。

Global site tag (gtag.js) - Google Analytics