0, Java四大名著:
Java编程语言(第三版)---Java四大名著----James Gosling(Java之父)
Java编程思想(第4版)----Java四大名著----------------Bruce Eckel
JAVA 2核心技术 卷I:基础知识---Java四大名著-----Cay Horstmann
JAVA 2核心技术 卷II:高级特性---Java四大名著-----Cay Horstmann
Effective Java中文版------Java四大名著--------Joshua Bloch
1, 第一个Java项目容易遇到的问题排查:
1、你的文件名对吗?
JAVA要求你的文件和你的类名严格对应的。
比如 public class HelloWorld{ .....
那么文件名一定只能是HelloWorld.java,看仔细了!
2、你的程序中有main方法吗?参数什么的对吗?
main方法的声明应该是这样子的:
public static void main(String[] args),注意String中的S必须是大写的。
事实上如果你用开发工具来做的话,是不会错的。如果你用UltraEdit之类的来写程序的话,就一个字不要改的照抄吧!
3、记住,javac后面跟的参数是文件名,但java 后面跟的是类名!
这是我开始学JAVA是犯的错,java HelloWorld.class,然后就报错。后来才弄明白,应该是java HelloWorld。
4、设置了classpath了吗?【jdk6以及以后的版本都不用再配CLASSPATH,而且也不建议去配】
不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:class目录。
设置classpath=%classpath%;d:class
那么,现在将HelloWorld.class文件COPY到d:class目录下,再java HelloWorld应该就OK了。
5、结合第3点和第4点
如果你的类是属于某一个包的,比如这样一个类sony.test.HelloWorld,那么按照我在第4点中说的目录来说,就应该将HelloWorld.class文件存放到d:classsony est目录下。
执行的时候应该参考第3点中说的,按类名执行:java sony.test.HelloWorld。6. 安装jdk时会有两个jre文件夹。外部的jre是公共的java运行环境,jdk文件夹内的jre是私有的java运行环境,intellij idea工具依赖的是jdk/jre私有的java运行环境。
7. 运行java Class 命令时,具体用到的是d:/jre/bin/java.exe还是d:jdk/bin/java.exe 应该是看机器环境变量Path配置的先后顺序。Path寻找是按照配置的先后顺序逐个找的,找到了就不继续找了,所以哪个在前用的就是哪个。
8. win10中 配置了环境变量javac,jar等命令依然提示找不到:将jdkin路径配置成绝对路径就好了。
9.
2,反编译Java的class文件
1,使用 cfr 进行反编译class文件。
2, cfr其实就是一个jar包,以正常的java -jar就能运行,然后传入指定的class文件。如:java -jar path/to/cfr_0_146.jar xxx.class
3, 其后可以指定一些参数。java -jar path/to/cfr_0_146.jar xxx.class --sugarenums false //这个参数是将enum类的语法糖解开,不加这个参数反编译的enum的class文件和源文件差不多,依然是还有语法糖的,加了这个参数就可以把enum的语法糖去掉。很有用!
4, 可以使用--help 查看各个参数的介绍。 java -jar path/to/cfr.jar --help
5,一个例子:
源文件:
enum RGB { RED, GREEN, BLUE; }反编译后的代码:
final class RGB extends Enum<RGB> { public static final /* enum */ RGB RED = new RGB("RED", 0); public static final /* enum */ RGB GREEN = new RGB("GREEN", 1); public static final /* enum */ RGB BLUE = new RGB("BLUE", 2); private static final /* synthetic */ RGB[] $VALUES; public static RGB[] values() { return (RGB[])$VALUES.clone(); } public static RGB valueOf(String string) { return Enum.valueOf(RGB.class, string); } private RGB(String string, int n) { super(string, n); } static { $VALUES = new RGB[]{RED, GREEN, BLUE}; } }
3,[Ljava.lang.Object Java中的这个符号什么意思?【参见此文章】
[Ljava.lang.Object;
是名称Object[].class
的java.lang.Class
表示的类的阵列Object
。
命名方案记录在Class.getName()
:
如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java语言规范(第13.1节)所指定。
如果此类对象表示基本类型或
void
,则返回的名称是与基本类型对应的Java语言关键字void
。如果此类对象表示一个数组类,则名称的内部形式由元素类型的名称组成,前面是一个或多个
'['
表示数组嵌套深度的字符。元素类型名称的编码如下:Element Type Encoding
boolean Z
byte B
char C
double D
float F
int I
long J
short S
class or interface Lclassname;
[Ljava.lang.Object 是这个名单上的最后一个, [ 表示一维数组。这里有些例子:
// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx
4,记录一个Java反射应用的例子
public class HighChinese { // 这里每次启动程序时是变化的,需求就是根据这个变量的值确定调用的方法。 private static Integer rule = 1; public static void convert() { String methodName = String.format("method%s", rule); /** * getDeclaredMethod 第一个参数是方法名,第二个参数是方法的所有参数的类型,是个Class数组 * getDeclaredMethod 返回自定义方法,getMethod 返回所有方法 */ Method method = HighChinese.class.getDeclaredMethod(methodName, new Class[]{B.class, C.class, D.class}); /** * invoke 方法第一个参数是 方法所在的实例,如果方法是静态的,则第一个参数设为 null * 后面的参数即是调用的方法的参数。 */ method.invoke(null, b, c, d); } public static void method1(B b, C c, D d) {} public static void method2(B b, C c, D d) {} public static void method3(B b, C c, D d) {} }
5,两层for循环,用break跳出的是只是最近的一层, 用return则是“跳出”两层
6,
7,
8,
9,
10,