test
PrivilegedCallable类
 PrivilegedCallable则是对Callable任务 的运行上下文的控制,它是Callable接口的一个特殊实现类,它表明Callable对象有某种特权来访问系统的某种资源,增加了权限控制功能的转换,对参数传进来的Callable增加权限控制功能的调用,可以将PrivilegedCallable看成是对Callable接口的封装,并且这个类也继承了Callable接口。
PrivilegedCallable类是一个final类,它不能被继承,因此PrivilegedCallable类的成员方法没有机会被重写,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。
同时它又是一个静态内部类,类比于静态方法,静态内部类不需要创建外部类对象就能使用,它不能访问外部类的成员域,只能访问静态变量
创建静态内部类的语法
1.在外部类内部创建内部类对象(Inner inner = new Inner())
Callable task = null;
PrivilegedCallable a = new PrivilegedCallable(task);
2.在外部类外部创建内部类对象,外部类.内部类 Executors.PrivilegedCallable<> a = new Executors.PrivilegedCallable();
Callable<Integer> task = null;
Executors.PrivilegedCallable<Integer> a = new Executors.PrivilegedCallable<>(task);
java 中泛型标记符:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的 java 类型
在PrivilegedCallable类中有两个成员变量,分别是Callable接口的实例对象和AccessControlContext类的实例对象,其中,AccessControlContext类可以理解为一个具有系统资源访问决策的上下文类,通过这个类可以访问系统的特定资源。
final修饰的变量即成为常量,只能赋值一次,但是final所修饰局部变量和
员变量有所不同。
(1)final修饰的局部变量必须使用之前被赋值一次才能使用
(2)final修饰的成员变量在声明时没有赋值的叫“空白final变量”,空白final变量必须在构造器方法或静态代码块中初始化。
native方法是java与其他语言协作的时候使用的,底层实现不是java(c,c++),所以直接调用就好,不需要管他底层实现
方法的字面意思就是获取能够访问系统栈的决策上下文对象
返回访问控制上下文。即,它获取堆栈上所有调用方的保护域,从具有非空保护域的第一个类开始。
返回:
基于当前堆栈的访问控制上下文,如果只有特权系统代码,则为 null。
如果需要,获取基于堆栈的上下文 (this) 并将其与特权或继承的上下文结合起来。无论分配的上下文是否来自立即封闭的受限 doPrivileged(),都会标记任何受限权限范围。有限的权限范围可以间接地从继承的父线程或先前由 getContext() 捕获的分配的上下文中流出。
一个类如果实现一个接口,那它必然要实现接口里的所有方法,内部方法callable接口有一个抽象方法call()
创建了一个接口的匿名对象,需要实现一下接口的方法
在PrivilegedExceptionAction接口对象的run()方法中调用Callable接口的call()方法来执行最终的业务逻辑,并且返回泛型对象。