java $.class_java文件编译后额外生成的$1.class是怎么一回事
首先java文件编译生成class文件其基本规则是这样的:
内部类的class文件命名是:主类+$+内部类名
匿名类的class文件命名是:主类+$+(1,2,3....)
但是如果没有使用匿名类,会生成带$1.class文件么~~答案是会的。
先来看这样一段代码~
public class TestJavac
{
void Test()
{
innerClass lklk = new innerClass();
lklk.biubiu();
}
private class innerClass
{
private innerClass()
{
// TODO 自动生成的构造函数存根
}
void biubiu()
{
System.out.println("XXXX");
}
}
}
此java文件经过javac编译后(注意是手动使用javac编译或者使用ant编译)应该生成几个class文件呢?
TestJavac.class
TestJavac$innerClass.class
这两个你肯定知道,但是还会生成一个TestJavac$1.class
这玩意儿是怎么来的?
将其反编译内容为~~空的class TestJavac$1
{
}
但是eclipse编译后就没有TestJavac$1.class这个文件,这究竟是嘛回事儿呢?
当内部类是私有的且没有明确书写公有的构造函数时,那么缺省构造函数就是私有的,javac对这种情况的处理就是创建一个可以访问的带有一个参数的构造函数,而这个参数的类型是一个匿名的静态类,所以编译时就会多生成一个匿名类的class文件,所以生成了XXX$1.class文件。
有人说JDK1.4才会有这种情况,但我的javac版本是1.6.0_21,也会有此问题。
Eclipse JDT使用的编译器与JDK提供的javac是不一样的,EclipseJDT使用的是它自己内建的编译器ecj(theEclipse Compiler for Java)或者说JDT Core Batch Compiler也行。有一些增强的功能,包括对上述情况的完美处理(不会凭空给你增加一个匿名类)。
想规避这种情况很简单:
1、内部类设为公有。
2、明确的书写内部类的构造函数并设置其可见性为public。3、使用其它的java编译器如JDT里的ecj。
对于如何在ANT中使用JDT的java编译器可以参考这篇文章
个人感觉:不是SUN的javac太差了,而是IBM的eclipse太强了~~
java $.class_java文件编译后额外生成的$1.class是怎么一回事相关推荐
- java $ class_java文件编译后额外生成的$1.class是怎么一回事
首先java文件编译生成class文件其基本规则是这样的: 内部类的class文件命名是:主类+$+内部类名 匿名类的class文件命名是:主类+$+(1,2,3....) 但是如果没有使用匿名类,会 ...
- 包含内部类的.java文件编译后生成几个.class文件
如果一个类有内部类,编译将生成几个字节码文件,规则是怎样呢? 写在前,自己动手丰衣足食,结论只有个人实验支持,没有官方数据支持,欢迎自行查阅文档然后来指正,轻喷,谢谢. 1.普通类包含内部类的样例 p ...
- Keil5使用AC6编译后,生成bin文件变为生成文件夹的解决办法
Keil5使用AC6编译后,生成bin文件变为生成文件夹的解决办法 KEIL AC5到AC6需要注意的地方 从AC5移植到AC6 解决流程 关键步骤 最近同事咨询改用keil的最新版本编译器编译原来的 ...
- Maven在pom文件中添加资源插件后,src/main/resource目录中的文件编译后不拷贝解决方法。
在pom文件中添加以下资源插件后 <!--添加的资源插件--> <build><resources><resource><directory> ...
- Qt中qrc文件编译后缺少预编译头文件
问题描述 在新电脑上编译之前可用的工程,报C1010错误.原因是xxx.qrc文件经过编译后,qrc_xxx.cpp文件中缺少#include "stdafx.h" 临时解决方案 ...
- 删除U盘文件夹后自动生成不同位数字的新文件夹
夹删除U盘文件后自动生成不同位数字的新文件夹解决方法 右键点击目录所在磁盘(C,D,E这种)的属性-选择工具-选择检查,系统自动修复文件系统错误. 如果U盘错误比较严重,修复的时间可能会比较久 然后在 ...
- 一个java源文件中可以声明多少个class与编译后会生成多少个字节码文件
在一个java源文件中可以声明多个class. 但是,只能最多有一个类声明为public的. 而且要求声明为public的类的类名必须与源文件名相同. 编译的过程 编译以后,会生成一个或多个字节码文件 ...
- java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?
比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...
- 编译后运行生成的exe文件,程序无法正常启动(0xc0000022)问题
对exe文件设置完全控制一直无法生效,猜测应该是由于生成的相关dll文件没有权限导致,这里直接对生成文件夹下所有的文件赋予权限: chmod 777 bin/* 最后就能运行了.
最新文章
- iOS使用自签名证书实现HTTPS请求
- python3自动释放线程_Python3高级特性:并发
- go语言练习:幂、函授接收和返回参数、转义字符、变量和常量
- 创建世界级品牌的大师忠告
- Net5 已经来临,让我来送你一个成功
- scala中抽象类_Scala中的抽象类
- python做词云做文本处理_Python生成词云的制作
- c语言设置输出字符大小_C语言中常用的几个头文件及库函数
- 2021年中国独立眼科超声系统市场趋势报告、技术动态创新及2027年市场预测
- 简述malloc/free与new/delete的区别
- 总结一下用caffe跑图片数据的研究流程接上篇
- centos安装ab测试工具
- Android基于Ymodem协议升级嵌入式MCU主控
- 计算机英语听力,每日英语听力pc版
- 电脑html怎么导入苹果手机,爱思助手把电脑视频怎么导入苹果手机 视频导入iPhone教程...
- oracle把修改成及联,oracle日常操作命令手册(用户管理)-从零到无
- 使用Linux命令cURL实现文件定时上传到ftp服务器的程序
- 从Mac的GUID分区谈起
- vuex中mutation和action的详细区别
- 【拓扑学知识】3.乘积空间与拓扑基