读 [深入Java虚拟机, v2]
组成Java沙箱的基本组件如下:
1.类装载器结构
双亲委派模式
2.Class文件检验器
4趟扫描
3.内置于Java虚拟机(及语言)的安全性 —- 内存分配由虚拟机决定
类型安全的引用转换
结构化的内存访问方法(无指针)
自动垃圾收集
数组边界检查
空引用检查
4.安全管理器及Java API
- java.security.SecurityManager 当创建安全管理器时,它对策略文件进行解析,并创建CodeSource(代码来源)和Permission(权限)对象,这些对象被封装在一个单独的 Policy对象中,这个Policy对象就代表了运行时的策略,任何时候每一个应用程序只能有一个Policy对象被安装.
- java.security.Permission
- java.security.Policy 以文件形式给代码来源授权. Policy.setPolicy()可用来替换Policy对象
- java.security.CodeSource 代码来源由代码库的URL和一些签名组成,从这个URL可以装载代码,而签名则为这个代码做担保.
- java.security.AccessController 当具体安全管理器的check方法被调用时,它们中的大多数都将请求传递给本类
- java.security.ProtectionDomain 保护域,类装载器利用它创建的CodeSource和从Policy对象得到的 PermissionCollection,类装载器可以实例化一个新的ProtectionDomain对象.它通过将合适的 ProtectionDomain对象传递给defineClass()方法,来将这段代码放到一个保护域中.在Policy对象中,每一个 CodeSource是和一个或多个Permission对象相关联的.和一个CodeSource相关联的Permission对象被封装在 java.security.PermissionCollection的一个子类实例中.
类装载器可以调用Policy.getPolicy()来获得一个当前有效的Policy对象的引用.然后它们可以调用Policy对象的 getPermission()方法,传入一个CodeSource,从而得到和那个CodeSource对应的Permission对象的 PermissionCollection.类装载器然后可以使用这个从Policy对象中得到的PermissionCollection来帮助判断应 该给导入的代码授予什么权限.
利用类装载器创建的CodeSource和它从Policy对象得到的PermissionCollection,类装载器可以实例化一个新的 ProtectionDomain对象.它通过将合适的ProtectionDomain对象传递给defineClass()方法,
来将这段代码放到一个保护域中.implies()方法
是在Permission类以及PermissionCollection类和ProtectionDomain类中声明的.implies()将一个Permission对象作为它唯一的参数,返回一个布尔值.
Permission类的implies()方法确定由Permission对象所代表的权限,是否在本质上隐含在由一个不同的Permission对象所代表的权限中.
PermissionCollection和ProtectionDomain的implies()方法确认了一个被传递的Permission对象是否 包含或隐含在封装在PermissionCollection或ProtectionDomain中的Permission对象集合中.
如读取/tmp目录下所有文件的权限隐含了读取/tmp目录下特定文件/tmp/f的权限,但反过来不成立.
Categorized in: Java · Tagged with: Java
关于Java中各种修饰符与访问修饰符的说明
网上,作者不详
类:访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称
(访问修饰符与修饰符的位置可以互换)
| 访问修饰符 | ||
| 名称 | 说明 | 备注 |
|
public |
可以被所有类访问(使用) |
public类必须定义在和类名相同的同名文件中 |
|
package |
可以被同一个包中的类访问(使用) |
默认的访问权限,可以省略此关键字,可以定义在和public类的同一个文件中 |
| 修饰符 | ||
| 名称 | 说明 | 备注 |
|
final |
使用此修饰符的类不能够被继承 |
|
|
abstract |
如果要使用abstract类,之前必须首先建一个继承abstract类的新类,新类中实现abstract类中的抽象方法。 |
类只要有一个abstract方法,类就必须定义为abstract,但abstract类不一定非要保护abstract方法不可 |
变量
l Java中没有全局变量,只有方法变量、实例变量(类中的非静态变量)、类变量(类中的静态变量)。
l 方法中的变量不能够有访问修饰符。所以下面访问修饰符表仅针对于在类中定义的变量。
l 声明实例变量时,如果没有赋初值,将被初始化为null(引用类型)或者0、false(原始类型)。
l 可以通过实例变量初始化器来初始化较复杂的实例变量,实例变量初始化器是一个用{}包含的语句块,在类的构造器被调用时运行,运行于父类构造器之后,构造器之前。
l 类变量(静态变量)也可以通过类变量初始化器来进行初始化,类变量初始化器是一个用static{}包含的语句块,只可能被初始化一次。
| 访问修饰符 | ||
| 名称 | 说明 | 备注 |
|
public |
可以被任何类访问 |
|
|
protected |
可以被同一包中的所有类访问 可以被所有子类访问 |
子类没有在同一包中也可以访问 |
|
private |
只能够被当前类的方法访问 |
|
|
缺省 无访问修饰符 |
可以被同一包中的所有类访问 |
如果子类没有在同一个包中,也不能访问 |
| 修饰符 | ||
| 名称 | 说明 | 备注 |
|
static |
静态变量(又称为类变量,其它的称为实例变量) |
可以被类的所有实例共享。 并不需要创建类的实例就可以访问静态变量 |
|
final |
常量,值只能够分配一次,不能更改 |
注意不要使用const,虽然它和C、C++中的const关键字含义一样 可以同static一起使用,避免对类的每个实例维护一个拷贝 |
|
transient |
告诉编译器,在类对象序列化的时候,此变量不需要持久保存 |
主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题 |
|
volatile |
指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理 |
|
方法
访问修饰符 修饰符 返回类型 方法名称(参数列表)throws 违例列表
l 类的构造器方法不能够有修饰符、返回类型和throws子句
l 类的构造器方法被调用时,它首先调用父类的构造器方法,然后运行实例变量和静态变量的初始化器,然后才运行构造器本身。
l 如果构造器方法没有显示的调用一个父类的构造器,那么编译器会自动为它加上一个默认的super(),而如果父类又没有默认的无参数构造器,编译器就会报错。super必须是构造器方法的第一个子句。
l 注意理解private构造器方法的使用技巧。
| 访问修饰符 | ||
| 名称 | 说明 | 备注 |
|
public |
可以从所有类访问 |
|
|
protected |
可以被同一包中的所有类访问 可以被所有子类访问 |
子类没有在同一包中也可以访问 |
|
private |
只能够被当前类的方法访问 |
|
|
缺省 无访问修饰符 |
可以被同一包中的所有类访问 |
如果子类没有在同一个包中,也不能访问 |
| 修饰符 | ||
| 名称 | 说明 | 备注 |
|
static |
静态方法(又称为类方法,其它的称为实例方法) |
提供不依赖于类实例的服务 并不需要创建类的实例就可以访问静态方法 |
|
final |
防止任何子类重载该方法 |
注意不要使用const,虽然它和C、C++中的const关键字含义一样 可以同static一起使用,避免对类的每个实例维护一个拷贝 |
|
abstract |
抽象方法,类中已声明而没有实现的方法 |
不能将static方法、final方法或者类的构造器方法声明为abstract |
|
native |
用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用C、C++编写的。 |
参见Sun的Java Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能 |
|
synchronized |
多线程的支持 |
当一个此方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回 |
接口
访问修饰符 interface 接口名称 extends 接口列表
l 接口不能够定义其声明的方法的任何实现
l 接口中的变量总是需要定义为“public static final 接口名称”,但可以不包含这些修饰符,编译器默认就是这样,显示的包含修饰符主要是为了程序清晰
| 访问修饰符 | ||
| 名称 | 说明 | 备注 |
|
public |
所有 |
|
|
无访问修饰符(默认) |
同一个包内 |
|
Categorized in: Java · Tagged with: Java
uml建模的若干步骤 - 读《inside XML》
UML建模可归纳为:
静态建模:侧重于描述系统的状态
动态建模:侧重于描述对信息的处理
用例:通常使用用例来建立静态模型,用例模型用于需求分析阶段。
1。获取执行者。
*谁使用系统的主要功能(主要使用者)
*谁需要系统支持他们的日常工作
*谁来维护、管理,使系统正常工作(辅助使用者)
*系统需要操纵那些硬件
*系统需要与其它哪些系统交互
*对系统产生的结果感兴趣的人或事物
2。获取用例
*执行者需要系统提供哪些功能
*执行者需要读、产生、修改、删除或存储的信息有哪些类型
*必须提醒执行者注意的系统事件有哪些,或者执行者必须提醒系统的事件有哪些。
怎样把事件转化为用例中的功能
*为了完整描述用例,还需要知道执行者的某些典型功能能否被系统自动实现
还有一些不针对执行者的问题(即针对整个系统的问题)
*系统需要何种输入输出?输入从何处来?输出到何处去?
*当前运行系统的主要问题
静态建模:
1。命名事物
2。分类
3。寻找关系
4。定义特性:静态模型的各种数据类型该如何组织
动态建模:
动态建模主要设计的内容是系统中信息的流动和处理,有如下几种动态建模方法:
1。处理模型和工作流模型
2。数据流模型
3。对象模型
4。对象生存周期历史
5。使用案例
6。对象交互图
Categorized in: Java · Tagged with: Java, UML
HttpClient以jdbc realm方式的系统集成
下面的一段代码可以实现用HttpClient集成一个web app到另一个web app中,前提是第一个web app的认证是服务器来作的,且方式为basic(在web.xml中设置<auth-method>BASIC</auth- method>)。当然,用HttpClient也可能集成其它认证方式的web app,但尝试没有成功。
try{
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(”hostname”, “8080″, “https”);
client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
// 将realm名称设置为null,表明对所有的realm均有效。
client.getState().setCredentials(null, “hostname”, new UsernamePasswordCredentials(”userName”, “password”));
// 如果想保持这种状态,可以将这个client放到session。在其它需要用到的时候
// 就可以取出来使用。
session.setAttribute(”HttpClient”, client);
} catch (Exception e) {
Log.get().error(”An exception is thrown, details as below :n” + e.getMessage());
}
Categorized in: Java · Tagged with: Java
创建了一个支持播放列表的MP3播放器插件
All rights are reserved by original author, please see its licence for detail.
See its demo named My iTunes Store at right panel on my blog
Download here
Installation:
1.untar it and put in wp_content/plugins
2.check to modify the url used in coolplayer.php if necessary
3.go to Admin, activate it in Plugins tab
4.write the code as below:
<p id=”player2″><a href=“http://www.macromedia.com/go/getflashplayer”>Get the Flash Player</a> to see this player.</p>
5. ok, that’s all
Optional: it is only available if your blog supports widget
6. edit your wp_includes/widget.php file, add the following code in function wp_widgets_init():
$class[’classname’] = ‘widget_recent_entries’; //for css wp_register_sidebar_widget(’iTunes-Store’, __(’My iTunes Store’), ‘wp_widget_itunes’, $class); wp_register_widget_control(’iTunes-Store’, __(’My iTunes Store’), ‘wp_widget_itunes’, $dims90);
7. at last, add a new function called wp_widget_itunes like this:
function wp_widget_itunes($args) {
extract($args);
$title=”My iTunes Store”;
echo $before_widget . $before_title . $title . $after_title;
echo ‘
- ’;
echo ‘Get the Flash Player to see this player.’;
echo ‘
Categorized in: Scripts · Tagged with: Plugins, Wordpress
sun的全名
sun起源于斯坦福大学,它的全名是Stanford University Network
Categorized in: Java · Tagged with: Java
How Servlet Containers Work
by Budi Kurniawan Translated by Javafuns
05/14/2003
编辑注: 在这个系列中, 本文和上一篇, “How Web Servers Work,” 是Tomcat 内部工作原理的指南书籍 How Tomcat Works 的节选. 如果你还没有读过上一篇, 那么赶紧先去读读吧; 那篇文章告诉了你一些有用的背景信息. 在本文里, 你会学习到怎样去创建2个 servlet 容器. 本书附带的程序可以下载. 如果你有兴趣的话, 在限定的时间内, 作者的网站上允许下载本书的其它部分.
本文讲解了一个简单的 servlet 容器是怎样工作的. 将会给您展示2个 servlet 容器应用程序; 第一个尽可能简单, 第二个则在第一个基础上做了美化. 我不想把第一个容器做的完美的唯一原因是让它尽可能保持简单. 更多复杂的 servlet 容器, 包括 Tomcat 4 和 5, 则在 How Tomcat Works 的其它章节讨论.
Categorized in: Java · Tagged with: Java
How Java Web Servers Work
by Budi Kurniawan Translated by Javafuns
04/23/2003
编辑批注: 本文改编自 Budi 个人出版的关于TOMCAT内部实现原理的书.你可以到他的网站上找到更多这方面的信息.
web server 也叫 Hypertext Transfer Protocol (HTTP) server, 因为它使用的是HTTP协议与客户端通信, 通常是指那些 web 浏览器. 基于 Java 的 web server 使用2个重要的类, java.net.Socket 和 java.net.ServerSocket, 进行HTTP消息通信. 因此,本文先讨论HTTP协议和这2个类. 之后, 我会讲解本书附带的一个简单的 web server 程序.
The Hypertext Transfer Protocol (HTTP)
HTTP 协议能够让 web servers 和浏览器通过 Internet 发送和接收数据. 它是一种请求-响应式的协议—客户端发起一个请求,服务器响应这个请求. HTTP 使用可信赖的 TCP 连接, 默认使用的是 TCP 的 80 端口. HTTP协议的第一个版本是 HTTP/0.9, 然后是 HTTP/1.0. 当前版本是由 RFC 2616(.pdf) 定义的 HTTP/1.1.
这部分简短的介绍了一下 HTTP 1.1; 足可以让你理解 web server 应用程序发出的消息. 如果你有兴趣了解更多的细节,请阅读 RFC 2616.
使用 HTTP 的时候, 客户端总是通过建立一个连接来开始一个事务,然后发送一个 HTTP 请求. server 不会主动联系客户端,也不会建立一个回调连接到客户端(is in no position to contact a client or to make a callback connection to the client). 客户端和服务器都可以提前中止一个连接. 例如, 当使用 web 浏览器的时候, 你可以点击浏览器上的 停止 按钮结束文件的下载过程, 有效关闭与 web 服务器的 HTTP 连接.

(
(4.00 out of 5)