`
ruruhuang
  • 浏览: 193280 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

透视java读书笔记(一)

阅读更多
  1. 反编译字节码所生成的源代码几乎与原始的源代码一致.

使用反编译器能够把没有经过特殊处理的class文件还原成几乎和源码一样的java文件.因为在class文件中几乎包括了一切可以用于调试的信息,行号,成员变量,参数类型和参数名称etc, 但是应该不包括javadoc和注释,正应为这样你才能用现代的IDE方便的调试你的程序.定位行,单步执行,审查值etc. 如果我们在编译源码的时候加上-g:none选项,反编译的代码就会损失一些清晰度.例如方法参数名称和局部变量的名称等等.


2. java字节码中,混淆是保护知识产权的最佳途径,混淆执行如下一些或全部变换:去除调试信息,<fontface="宋体, simsun"="">名称的处理,编码字符串,改变控制流程,插入讹用的代码,删除未使用的代码和优化代码.混淆带来了维护的困难,这可以通过配置混淆程序将其减到最小.混淆的代码仍旧可读,除非使用了控制流程的混淆和字符串编码.


  1. 没有被声明为public的方法和变量仍然可以访问.

    1. 具有packageprotected可视属性的成员可以通过将助手类插入其包中或使用反射API访问

当变量或方法没有用可视性关键字(publicprotected private)声明时,就是packagevisible.假如一个包中的某个类有个packagevisible的属性,但是他又没有提供getter方法给你,你又想获得这个属性的值,那我们可以在这个包中加一个助手方法.为这个packagevisible的属性提供一个getter方法.不过当那个包是系统包时,可能会发生SecurityException.我们下面会讨论这个.

    1. 使用反射访问私有类成员或方法.

这里要注意的是,如果设置了安全管理器(大多数应用服务程序和中间产品通常都是这样),那么我们还需要多做一些工作,要不就会发生RumtimePermission发生.为了让我们的代码能和已安装的安全管理器协同工作,必须准予通过反射访问声明的成员以及禁止访问检查的许可,这通过添加准予codebase这两种许可java政策文件的方式来实现:

grant{

permissionjava.lang.RuntimePermission “accessDeclaredMembers”;

permissionjava.lang.reflect.ReflectPermission “suppressAccessChecks”;

};

javacommand中加上 -Djava.security.manager–Djava.security.policy=../conf/java.policy

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics