你说的这些方法我都知道.
下面是我输出的class文件内容格式:- ObjectType:
- L Classname ;
- ArrayType:
- [ComponentType MethodDescriptor: ( ParameterDescriptor* ) ReturnDescriptor
- ParameterDescriptor: FieldType
- ReturnDescriptor: FieldType VoidDescriptor VoidDescriptor:
- V
复制代码 通过阅读class文件格式可以反推出java源代码,如果你够N的话,反编译工具也是通过这样实现的.
还有javassist工具也是通过class文件格式翻过来修改class文件而实现的.
我说javap功能不强大就是不能完整的反推出java源代码,下面这段是我用javap来反编译的结果:- Compiled from "Open.java"
- public class Open {
- public Open();
- public static void main(java.lang.String[]);
- }
复制代码 其实真是的源代码是:- public class Open {
- public static void main(String[] ages){
- int length=ages.length;
- if(length==0){
- System.out.println("文件名不能为空");
- }else{
- if(length==1){
- new Open().function(ages[0],"G");
- }else if(length==2){
- new Open().function(ages[0],ages[1]);
- }else{
- System.out.println("参数错误,请从新输入!");
- }
- }
- }
- //程序主功能方法
- private void function(String fileStc,String encoding){
- //验证encoding参数
- if("u".equals(encoding)||"U".equals(encoding)||"G".equals(encoding)||"g".equals(encoding)||"c".equals(encoding)||"C".equals(encoding)){
- //确定编码方式
- String encodingTrue = null;
- switch(encoding.charAt(0)){
- case 'u':encodingTrue="UTF-8";break;
- case 'U':encodingTrue="UTF-8";break;
- case 'g':encodingTrue="GBK";break;
- case 'G':encodingTrue="GBK";break;
- case 'c':encodingTrue="unicode";break;
- case 'C':encodingTrue="unicode";break;
- }
- //开始读取文件
- FileInputStream fi=null;
- try {
- fi=new FileInputStream(fileStc);
- byte[] b=new byte[1024];
- int end;
- while((end=fi.read(b))>0){
- //输出到控制台
- System.out.println(new String(b,0,end,encodingTrue));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(fi!=null){
- try {fi.close();} catch (IOException e) {throw new RuntimeException("读取流异常退出");
- }
- }
- }
- }else{
- System.out.println("未知编码"+encoding);
- }
- }
复制代码 现在你知道我想问什么了吧?还有我已经说过笔记我做过,只是后来硬盘被格式化而丢失了.呵呵...不过还是谢谢你,哥们 |