如何加载java代码文件 如何加载java代码文件

如何将JAVA文件夹导入到Eclipse中?1、找到java项目所在的文件夹 。如果我的项目位于名为Servlet的文件夹中,那么我需要找到Servlet文件夹 。
2、找到这个文件夹后 , 我们需要打开eclipse 。
3、单击下面显示的内容开始导入我们之前编写的java项目 。
4、转到下面显示的界面,找到常规并单击它 。
5、单击“常规”后,您需要找到下面显示的内容,然后单击以转到下一步 。
6、接下来,您需要单击下面显示的内容以选择创建项目的文件目录 。
7、转到下面显示的界面,您需要找到您的项目路径,这是我们在第一步中找到的路径,单击以选择文件目录 。
8、对于具体操作,您可以参考下图,但我们的项目位置不同,您需要根据您的项目进行操作或找不到项目 。
9、转到下面显示的界面 , 然后选择要导入的项目 。由于我的项目已导入且无法再次导入,因此它显示为灰色 。
10、单击完成后,您可以看到您的项目已导入到eclipse中,可以根据需要进行编辑 。
java代码怎样运行出来?步骤:
1、在cmd中切换到编写的代码所保存的目录下;
2、在cmd中输入javac然后点空格 , 再点击文件名和包括后缀名确定后,在存放编写代码的文件下会生成一个class的字节码文件;
3、在cmd中输入java然后点空格,输入第二步中生成的字节码的文件名,不需要后缀名 , 点击确定即可运行代码 。
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系 。计算机代码称为源代码,是相对目标代码和可执行代码而言的 。源代码就是用汇编语言和高级语言写出来的地代码,目标代码是指源代码经过编译程序产生的能被cpu直接识别二进制代码 。
如何用JAVA实现加载一个文件?JAVA文件上传组件
文件上传的方法多种多样如何加载java代码文件 , 但个人偏爱三方包实现文件上传,因为使用三方包能使代码更简单,可读性更高,文件上传的三方包通常如何加载java代码文件我们使用commons-fileupload和jspSmartUpload , 相比之下本人更钟爱与jspSmartUpload.jar,使用该三方包实现上传和下载都很简单,使用该包只有一点需要注意的地方 , 从jsp页面获得form中的信息的时候不在是HttpServletRequest request.getParameter,而是要先使用getParameter方法得到一个com.jspsmart.upload.Request的对象,然后通过这个对象来得到jsp组件中的信息 。
File类主要提供以下方法:
1、saveAs作用:将文件换名另存 。
原型:
public void saveAs(java.lang.String destFilePathName)

public void saveAs(String destFilePathName, int optionSaveAs)
其中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值 , 分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO 。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件,SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时 , 它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL 。
例如,saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文件名实际是c:\upload\sample.zip 。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload,则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip 。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录,则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL),否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL) 。
建议:对于Web程序的开发来说,最好使用SAVEAS_VIRTUAL,以便移植 。
2、isMissing
作用:这个方法用于判断用户是否选择如何加载java代码文件了文件,也即对应的表单项是否有值 。选择了文件时,它返回false 。未选文件时,它返回true 。
原型:public boolean isMissing()
3、getFieldName
作用:取HTML表单中对应于此上传文件的表单项的名字 。
原型:public String getFieldName()
4、getFileName
作用:取文件名(不含目录信息)
原型:public String getFileName()
5、getFilePathName
作用:取文件全名(带目录)
原型:public String getFilePathName
6、getFileExt
作用:取文件扩展名(后缀)
原型:public String getFileExt()
7、getSize
作用:取文件长度(以字节计)
原型:public int getSize()
【如何加载java代码文件 如何加载java代码文件】8、getBinaryData
作用:取文件数据中指定位移处的一个字节,用于检测文件等处理 。
原型:public byte getBinaryData(int index) 。其中,index表示位移,其值在0到getSize()-1之间 。
二 Files类
这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息 。有以下方法:
1、getCount
作用:取得上传文件的数目 。
原型:public int getCount()
2、getFile
作用:取得指定位移处的文件对象File(这是com.jspsmart.upload.File , 不是java.io.File , 注意区分) 。
原型:public File getFile(int index) 。其中,index为指定位移,其值在0到getCount()-1之间 。
3、getSize
作用:取得上传文件的总长度 , 可用于限制一次性上传的数据量大小 。
原型:public long getSize()
4、getCollection
作用:将所有上传文件对象以Collection的形式返回,以便其它应用程序引用,浏览上传文件信息 。
原型:public Collection getCollection()
5、getEnumeration
作用:将所有上传文件对象以Enumeration(枚举)的形式返回 , 以便其它应用程序浏览上传文件信息 。
原型:public Enumeration getEnumeration()
三 Request类
这个类的功能等同于JSP内置的对象request 。只所以提供这个类,是因为对于文件上传表单,通过request对象无法获得表单项的值 , 必须通过jspSmartUpload组件提供的Request对象来获取 。该类提供如下方法:
1、getParameter
作用:获取指定参数之值 。当参数不存在时,返回值为null 。
原型:public String getParameter(String name) 。其中 , name为参数的名字 。
2、getParameterValues
作用:当一个参数可以有多个值时,用此方法来取其值 。它返回的是一个字符串数组 。当参数不存在时,返回值为null 。
原型:public String[] getParameterValues(String name) 。其中,name为参数的名字 。
3、getParameterNames
作用:取得Request对象中所有参数的名字,用于遍历所有参数 。它返回的是一个枚举型的对象 。
原型:public Enumeration getParameterNames()
四 SmartUpload类这个类完成上传下载工作 。
A.上传与下载共用的方法:
只有一个:initialize 。
作用:执行上传下载的初始化工作,必须第一个执行 。
原型:有多个,主要使用下面这个:
public final void initialize(javax.servlet.jsp.PageContext pageContext)
其中,pageContext为JSP页面内置对象(页面上下文) 。
B.上传文件使用的方法:
1、upload
作用:上传文件数据 。对于上传操作,第一步执行initialize方法,第二步就要执行这个方法 。
原型:public void upload()
2、save
作用:将全部上传文件保存到指定目录下,并返回保存的文件个数 。
原型:public int save(String destPathName) 和public int save(String destPathName,int option)
其中,destPathName为文件保存目录,option为保存选项,它有三个值,分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO 。(同File类的saveAs方法的选项之值类似)SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下,SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下,而SAVE_AUTO则表示由组件自动选择 。
注:save(destPathName)作用等同于save(destPathName,SAVE_AUTO) 。
3、getSize
作用:取上传文件数据的总长度
原型:public int getSize()
4、getFiles
作用:取全部上传文件,以Files对象形式返回,可以利用Files类的操作方法来获得上传文件的数目等信息 。
原型:public Files getFiles()
5、getRequest
作用:取得Request对象,以便由此对象获得上传表单参数之值 。
原型:public Request getRequest()
6、setAllowedFilesList
作用:设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出异常 。
原型:public void setAllowedFilesList(String allowedFilesList)
其中,allowedFilesList为允许上传的文件扩展名列表,各个扩展名之间以逗号分隔 。如果想允许上传那些没有扩展名的文件 , 可以用两个逗号表示 。例如:setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件 。
7、setDeniedFilesList
作用:用于限制上传那些带有指定扩展名的文件 。若有文件扩展名被限制,则上传时组件将抛出异常 。
原型:public void setDeniedFilesList(String deniedFilesList)
其中,deniedFilesList为禁止上传的文件扩展名列表,各个扩展名之间以逗号分隔 。如果想禁止上传那些没有扩展名的文件,可以用两个逗号来表示 。例如:setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件 。
8、setMaxFileSize
作用:设定每个文件允许上传的最大长度 。
原型:public void setMaxFileSize(long maxFileSize)
其中,maxFileSize为为每个文件允许上传的最大长度,当文件超出此长度时,将不被上传 。
9、setTotalMaxFileSize
作用:设定允许上传的文件的总长度,用于限制一次性上传的数据量大小 。
原型:public void setTotalMaxFileSize(long totalMaxFileSize)
其中,totalMaxFileSize为允许上传的文件的总长度 。
C.下载文件常用的方法
1、setContentDisposition
作用:将数据追加到MIME文件头的CONTENT-DISPOSITION域 。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,请用此方法 。
原型:public void setContentDisposition(String contentDisposition)
其中,contentDisposition为要添加的数据 。如果contentDisposition为null,则组件将自动添加"attachment;",以表明将下载的文件作为附件,结果是IE浏览器将会提示另存文件,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的将用word程序打开,扩展名为pdf的将用acrobat程序打开,等等) 。
2、downloadFile
作用:下载文件 。
原型:共有以下三个原型可用,第一个最常用,后两个用于特殊情况下的文件下载(如更改内容类型,更改另存的文件名) 。
① public void downloadFile(String sourceFilePathName)
其中,sourceFilePathName为要下载的文件名(带目录的文件全名)
② public void downloadFile(String sourceFilePathName,String contentType)
其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别) 。
③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName)
其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别),destFileName为下载后默认的另存文件名 。
一个简单的上传:
JSP上传表单项
form id="form2" name="form2" enctype="multipart/form-data" method="post" action="Loadservlet"onSubmit="return checks()"
label
br /
input type="text" name="textfield2" size = 50/
请输入公文接受部门IDbr /
br /
input name="textfield" type="text" size = 50 /
请输入上传公文名br /
br /
input type="file" name="file" size = 50/
/label
p
span class="STYLE3"*注意:为避免你的系统出现不必要的错误 , 请在上传时使用英文名/spanbr //p
p
label
input type="submit" name="Submit" value="https://www.04ip.com/post/save"//label
label
input name="Submit2" type="reset" value="https://www.04ip.com/post/重置" /
/label
/p
/form
Servlet对文件做处理
首先建立Servlet后得从servlet超类继承来一个config对象
final public void init(ServletConfig config) throws ServletException {
super.init(config);
this.config = config;
}
现在该处理上传了
String Filename = "";
String upload = "D:\\javac\\OfficeAuto\\upload";
SmartUpload su = new SmartUpload();
su.initialize(config, request, response);
su.setMaxFileSize(5*1024*1024);//限止文件上传大小
// su.setTotalMaxFileSize(20000);限制总上传数据的长度 。
// su.setAllowedFilesList("doc,txt");设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件 。
try {
su.upload();
int count = su.save(upload);
} catch (ServletException e1) {
response.sendRedirect("loaderror.jsp");
} catch (IOException e1) {
response.sendRedirect("loaderror.jsp");
} catch (SmartUploadException e) {
response.sendRedirect("loaderror.jsp");//如果连这个方法是啥都不知道建议你不要学J2EE,5角钱买个豆腐来撞
}
for(int i = 0; isu.getFiles().getCount(); i)
{
com.jspsmart.upload.File file = su.getFiles().getFile(i);
Filename = file.getFileName();//得到文件名
}
com.jspsmart.upload.Request re = su.getRequest();//得到Request对象
bean.setDeptID(re.getParameter("textfield2").toString());
bean.setFile(Filename);
bean.setFilepath(upload "\\" Filename);
bean.Beginsert();//交给业务Bean,该干嘛干嘛去
response.sendRedirect("succeed.jsp");//处理完以后忘了转专或者重定向到别的页面去,别以为到别人家去吃了饭可以不走
如果你是用jsp在处理上传,那么只有两点不一样,首先你不用去继承config对象,其次initialize();方法的参数改成pageContext;
一个简单的下载:
SmartUpload su = new SmartUpload();
su.initialize(config, request, response);
su.setContentDisposition(null);
try {
su.downloadFile("D:/javac/OfficeAuto/upload/上传文件.txt");
} catch (ServletException e) {
response.sendRedirect("error.jsp");
e.printStackTrace();
} catch (IOException e) {
response.sendRedirect("error.jsp");
e.printStackTrace();
} catch (SmartUploadException e) {
// TODO 自动生成 catch 块
response.sendRedirect("error.jsp");
}
希望对你有帮助
java如何加载一个外部的类或class文件不知道你用的什么开发软件 , 本人用的是MyEclipse,在里面想要加载一个存在的java文件 可以直接将该java文件复制到该工程内,或者将class文件复制到bin目录中,或者是一楼那位仁兄说的打成jar包 , 然后导入后者直接复制到bin目录下
路径写全,就是你那个要导入的类的package 后面的包名.类名
如mysql的驱动com.mysql.jdbc.Driver
怎么 classloader 加载一个java源文件1.类加载器深入剖析
Java虚拟机与程序的生命周期 :
当我们执行一个java程序的时候 , 会启动一个JVM进程 , 当程序执行完之后 , JVM进程就消亡了 ;
在如下情况下JVM将结束声明周期 :
System.exit(int)方法 , 当执行这个方法的时候 , 虚拟机会退出 ; 这个方法传入一个整形参数 , 这个参数是状态吗 :如果这个整形是 0 的话 , 就是正常退出 , 如果不是0的话 , 就是异常退出 ;
程序正常结束 ;
程序执行过程中 , 遇到了异常或错误 , 而异常终止 : 如果我们在程序中出现了异常 , 而不去处理 , 会将异常一直抛给main函数 , main函数会将异常抛给JVM , JVM如果处理不了异常 , JVM就会异常退出 ;
由于操作系统出现错误导致JVM进程终止 : JVM所依赖的平台出现错误 , 导致JVM终止 ;
2.类的加载,连接和初始化
加载 : 查找并加载类的二进制数据 , 将class字节码文件加载到内存中 ;
连接:
-
验证
: 确保被加载的类的正确性 , 使用javac 编译工具生成的字节码文件能通过验证 , 如果不是由javac编译生成的字节码文件 , 如果自己生成的字节码文件不符合JVM虚拟机对字节码文件的要求的话 , 可能会出现验证通不过的情况; 比如说随便拿一个文件 , 将后缀名直接修改为.class , 这样的字节码文件肯定不合法 ;
-
准备
: 为类的静态变量分配内存 , 并将其初始化为默认值 ;
-
解析
: 把类中的符号引用转为直接引用 ;
初始化: 为类的静态变量赋予正确的初始值(正确的值指的是用户赋的值) ;
-好像这个与连接阶段的准备有些重复 , 在连接的准备阶段只是赋予初始变量 , 如果用户给这个变量赋了初始值 , 那么这个变量在连接的准备阶段仍然会赋予初始值 ;
-在这个阶段 , 才会真正的将初始值赋给静态变量 ;
Java程序对类的使用方式有 主动使用 和 被动使用 ;
所有的JVM实现 , 必须在每个类或者接口 , 被java程序 “首次主动使用” 时才初始化他们 ;
主动使用 :
创建类的实例 ;
访问某个类或接口的静态变量 , 或者对该静态变量赋值 ;
调用类的静态方法 ;
反射 : Class.forName(“类名”) ;
初始化一个类的子类 , 看做对父类的主动使用 ;
java虚拟机启动的时候 , 被标明启动类的类 , 即包含main方法的类 , 程序的入口 ;
除了上面6种主动使用之外 , 其它的情况均为被动使用 , 其它情况都不会执行第三步初始化 ;
3.类的加载
(1)概念
类的加载 : 指的是将类的.class文件中的二进制数据读入到内存中 , 将其放在运行时数据区的方法区内 , 然后再堆区创建一个java.lang.Class对象 , 用来封装类在方法区内的数据结构 ;
反射 : 反射就是跟句堆区的字节码文件 , 获取方法去的数据结构 ;
解析 : Class对象是由JVM自己创建的 , 所有的对象都是经过Class对象创建 , 这个Class对象是反射的入口, 通过Class对象 , 可以关联到目标class字节码文件的内部结构 ;
所有的类对应的Class对象都是唯一的一个 , 这个类是由JVM进行创建的 , 并且只有JVM才会创建Class对象 ;
类加载的最终产品是位于堆区中的Class对象 , Class对象封装了类在方法区内的数据结构 , 并且向Java程序员提供了访问方法区内的数据结构的接口(反射用的接口) ;
(2)加载.class文件的方式
从本地系统中直接加载 : 编译好的.class字节码文件直接从硬盘中加载 ;
通过网络下载.class文件 : 将class字节码文件放在网络空间中 , 使用URLClassLoader来加载在网络上的.class字节码文件 , 使用默认的父亲委托机制加载字节码文件 ;
从zip , jar 等压缩文件中加载字节码文件 : 在开发的时候 , 导入jar包 , 就是这种方式 ;
从专有的数据库中提取字节码文件 ;
将java源文件动态编译为字节码文件 ;
(3)类加载器
lJava虚拟机自带的类加载器 :
-根类加载器 ( Bootstrap ) : 是C写的 , 程序员无法再java代码中获取这个类 , 如果使用getClassLoader()方法获取到的是一个null值 ;
package jvm;
Java代码
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
//java.lang包下的类使用的是跟类加载器进行加载的
Class clazz = Class.forName("java.lang.String");
System.out.println(clazz.getClassLoader());
//自定义的类使用的是应用类加载器(系统加载器)
Class clazz2 = Class.forName("jvm.C");
System.out.println(clazz2.getClassLoader());
}
}
class C{}
执行结果 :
null
Java代码
sun.misc.Launcher$AppClassLoader@1372a1a
-扩展类加载器 ( Extension ) : Java编写 ;
-系统类加载器(应用加载器) ( System ): Java编写 ;
用户自定义的类加载器 :
-自定义的类加载器都是java.lang.ClassLoader子类 ;
-用户可以定制类的加载方式
String类是由根类加载器进行加载的 , 我们可以调用Class对象的
关于代理中创建对象的类加载器 : 创建代理对象的时候 , 动态创建一个类 , 然后使用指定的类加载器将这个类加载到内存中 , 然后用加载到内存中的类生成代理对象 ;
创建代理对象的方法 : newProxyInstance(ClassLoader loader , Class [] Interfaces , InvocationHandler h )
loader 是定义的代理类的类加载器 , 中间的接口数组是代理类的要实现的接口列表 , h 是指派方法调用的调用处理程序 ;
类加载器并不需要在某个类被 “首次主动使用” 时再加载它 :
-预加载机制 : JVM规范允许类加载器在预料某个类将要被使用的时就预先加载它 ;
-报错时机 : 如果在预加载的过程中遇到了字节码文件缺失或者存在错误的情况 , 类加载器会在程序首次主动使用(上面提到的六种情况)该类的时候报错(LinkageError错误) ;
-不报错时机 : 如果这个错误的字节码文件所对应的类一直没有被使用 , 那么类加载器就不会报告错误 ,即便有错误也不会报错 ;
LinkageError : 这个错误是Error的子类 , 程序不能处理这些错误 , 这些错误都是由虚拟机来处理 , 这个错误表示出错的是子类 , 在一定程序上依赖于另一个类 , 在编译了前面一个类的时候 , 与后面所依赖的类出现了不兼容的情况 ;
例如 : 我们使用了jdk 1.6 在编译一个程序 , 但是运行环境是jre1.5的 , 就会出现LinkageError错误 ;
4.类的连接
(1)定义
类被加载之后 , 就进入链接阶段 ; 链接 : 将已读入内存的二进制数据合并到虚拟机的运行时环境中去 ;
链接顾名思义就是讲类与类之间进行关联 , 例如我们在类A中调用了类B , 在链接过程中 , 就将A与B进行链接 ,将面向对象语言转化为面向过程语言 ;
(2)类的验证
类文件的结构检查 : 确保类文件遵从java类文件的固定格式 , 开始类的描述 , 声明 , 方法调用格式等 ;
语义检查 : 确保类本身符合java语言的语法规定 , 比如final类型的类没有子类 , final类型的方法没有被覆盖 ,在eclipse中这种错误编译的时候不能通过 , 但是通过其他的方法可以生成错误的字节码文件 , 这里就是检测恶意生成的字节码文件 ;
字节码验证 : 确保字节码流可以被JVM安全的执行 , 字节码流代表java方法(包括静态方法和实例方法) , 它是由被称作操作码的单字节指令组成的序列 , 每一个操作码后面跟着一个或多个操作数 , 字节码验证步骤会检查每个操作码是否合法 , 即是否有着合法的操作数 ;
下面是指令码组成的序列 , 类似于微指令 :
Jvm编译指令代码代码
// Compiled from ByteToCharCp1122.java (version 1.5 : 49.0, super bit)
public class sun.io.ByteToCharCp1122 extends sun.io.ByteToCharSingleByte {
// Field descriptor #17 Lsun/nio/cs/ext/IBM1122;
private static final sun.nio.cs.ext.IBM1122 nioCoder;
// Method descriptor #18 ()Ljava/lang/String;
// Stack: 1, Locals: 1
public java.lang.String getCharacterEncoding();
0ldc String "Cp1122" [1]
2areturn
Line numbers:
[pc: 0, line: 25]
// Method descriptor #2 ()V
// Stack: 2, Locals: 1
public ByteToCharCp1122();
0aload_0 [this]
1invokespecial sun.io.ByteToCharSingleByte() [25]
4aload_0 [this]
5getstatic sun.io.ByteToCharCp1122.nioCoder : sun.nio.cs.ext.IBM1122 [23]
8invokevirtual sun.nio.cs.ext.IBM1122.getDecoderSingleByteMappings() : java.lang.String [27]
11putfield sun.io.ByteToCharSingleByte.byteToCharTable : java.lang.String [24]
14return
Line numbers:
[pc: 0, line: 28]
[pc: 4, line: 29]
[pc: 14, line: 30]
// Method descriptor #2 ()V
// Stack: 2, Locals: 0
static {};
0new sun.nio.cs.ext.IBM1122 [15]
3dup
4invokespecial sun.nio.cs.ext.IBM1122() [26]
7putstatic sun.io.ByteToCharCp1122.nioCoder : sun.nio.cs.ext.IBM1122 [23]
10return
Line numbers:
[pc: 0, line: 22]
}
l二进制兼容性的验证 : 确保相互引用的类之间协调一致的 ; 例如在A类的a()方法中调用B类的b()方法 , JVM在验证A类的时候 , 会验证B类的b()方法 , 加入b()方法不存在 , 或者版本不兼容(A,B两类使用不同的JDK版本编译) , 会抛出NoSuchMethodError错误 ;
(3)准备阶段
在准备阶段 , JVM为类的静态变量分配内存空间 , 并设置默认的初始值 . 例如下面的Sample类 , 在准备阶段 ,为int类型的静态变量分配4个字节 , 并赋予初始值 0; 为long 类型的静态变量 b , 分配8个字节 , 并赋予初始值 0 ;
PS : 在java中基本类型变量占用的空间是一定的 , java运行在JVM上的 , 在C中 , 就要根据平台变化而变化了 ;
public class Sample {
Java代码
private staticint a = 1 ;
private static long b ;
static {
b = 2 ;
}
(4)类的解析
在解析阶段 , JVM 会把类的二进制数据中的符号引用替换为直接引用 , 例如在A类中的a()方法引用B类中的b()方法 ;
在A类的二进制数据中包含了一个对B类的b()方法的符号引用 , 这个符号引用由b()方法的全名和相关的描述符组成 , 在Java解析阶段 , 就会把这个符号引用替换为指针 , 这个指针就是C语言中的指针了 , 该指针指向B类的b()方法在方法区中的内存位置 , 这个指针就是直接引用 ;
5.类的初始化
在初始化阶段 , Java虚拟机执行类的初始化操作 , 为类的静态变量赋予初始值 , 在程序中 , 静态变量初始化有两种途径 :
直接在声明处进行初始化 , 例如下面的Sample中的 变量a ;
在静态代码块中进行初始化 , 例如下面的Sample中的变量b ;
Java代码
public class Sample {
private staticint a = 1 ;
private static long b ;
static {
b = 2 ;
}
}
6.面试题介绍
Java代码
public class PrepareOrInit {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
class Singleton{
private static Singleton singleton = new Singleton() ;
public static int count1 ;
public static int count2 = 0 ;
private Singleton(){
count1;
count2;
}
public static Singleton getInstance(){
return singleton ;
}
}
执行结果 : 10
分析 : 这段代码与类的链接中的准备阶段 和 初始化阶段 有关系 , 准备阶段是给静态的字段赋予默认值 , 初始化阶段给静态变量赋予正确的值 , 即用户的值 ;
在主函数中 , 调用了类的静态方法 , 相当于主动使用 , 这里调用了类的静态方法 ;
之后进行连接的准备操作 , 给类中的静态变量赋予初值 , singleton值为null , count1 与 count2 值为0 ;
执行初始化操作 , 给类中的静态变量赋予正确的值 , 给singleton变量赋予正确的值 , 调用构造方法 , 此时count1与 count2执行自增操作 , 两者都变成1 , 然后执行count1的赋予正确值操作 , 这里用户没有赋值操作 , count2 用户进行了 赋值为0的操作 , 0将原来的1覆盖掉了 , 因此结果为 1 , 0 ;
Java代码
public class PrepareOrInit {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
class Singleton{
public static int count1 ;
public static int count2 = 0 ;
private static Singleton singleton = new Singleton() ;
private Singleton(){
count1;
count2;
}
public static Singleton getInstance(){
return singleton ;
}
}
执行结果 : 11
在准备阶段count1 和 count2 都赋值为0 , 然后在初始化阶段 , 全部赋值为1 ;
关于如何加载java代码文件和如何加载java代码文件的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读