我们都知道封装有很多优点,请看如下代码:
public
class
Man
{
private
String name;
private
int age;
public
int getAge() {
return
age;
}
public
String getName() {
return
name;
}
public
void setAge(int i) {
If(age<=0)
return;
age
= i;
}
public
void setName(String string) {
name
= string;
}
}
如果,我们要将
name
拆分为
firstname
与
lastname
,对于访问器的代码,我们可以改写为如下:
public String
getName() {
return
firsst
name
+" "+lastname
;
}
这样,除了改变类的方法外,不会影响其他代码
,
这样有利于降低程序的耦合性。
还有就是更改器可执行错误检查,不合条件的值可以不予处理。
比如,我们想设置
age
的值,其值必须大于
0
。我们可以在
setAge
方法里面做检查。
可是难道我们把类的实例域设置为私有的(
private
),然后提供其访问器与更改器,就真的实现了封装了吗?
请看如下代码:
public class Order{
private
Man man;
public
Man getMan() {
return
man;
}
public
void setMan(Man man) {
this.man
= man;
}
}
该类中有个实例变量:引用
Man
的实例对象一个
man
。它的访问器方法返回的是一个
Man
对象。这样做,其实没有起到封装的作用。如:
Order
o=…;
Man
man=o.getMan();
man.setName("mark");
System.out.println(
o
.getMan().getName()
);
//
输出
mark
。
这样就改变了原
Order
对象中实例域
man
的状态(一般类都有一组特定的实例域值,这些值的集合就是这个对象的当前状态),
man
中的
name
属性由原来的值变为了
"mark"
。很显然这是一个有漏洞的封装!!!
所以对于这种引用类型的实例域,我们应该改写其访问器方法为:
public Man getMan()
{
return
(Man)man.clone()
;
}
此时
Man
类的代码需要改写为:
public
c
lass Man implements Cloneable
{//实现标记接口Cloneable。意味这该Man类可以克隆
private
String name;
private
Date birthday;
private
int age;
public
String getName() {
return
name;
}
public
void setName(String string) {
name
= string;
}
public
Man(String name,Date d,int age) {
this.name
= name;
this.birthday=d;
this.age=age;
}
/**
* 覆盖Object中的clone()方法。
*/
public
Object clone() throws CloneNotSupportedException {
Man cloned = (Man)super.clone();//浅克隆(不会克隆子对象,
子
对象需单独克隆)
cloned.birthday=(Date)birthday.clone();//克隆子对象
return
cloned;
}
public
int getAge() {
return
age;
}
public
Date getBirthday() {
return
birthday;
}
public
void setAge(int i) {
age
= i;
}
public
void setBirthday(Date date) {
birthday
= date;
}
}
这样就不会出现上面所说的封装漏洞了
。
这里,顺便说一下
final
实例域。将实例域定义为
final
,构建对象时就必须初始化这样的域,也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,且在后面的操作中,不能够再对它进行修改。
final
修饰符大都应用于基本数据,或者不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类,
String
类就是一个不可变的类)。对于可变的类,使用
final
修饰可能会对读者造成混乱。例如,
private
final date birthday;
仅仅意味着存储在
birthday
变量中的对象引用在对象构造之后不能改变,而并不意味着
birthday
引用的
Date
实例对象是一个常量,任何方法都可以对
birthday
引用的
Date
对象调用
setTime
方法改变
birthday
引用的
Date
实例对象的状态。
分享到:
相关推荐
8. **更新与维护**:工具可能包含自动更新功能,确保系统封装过程使用的都是最新的补丁和软件版本,以减少安全漏洞。 9. **日志记录**:为了便于问题排查和日后的优化,SC封装工具可能会记录详细的执行日志,记录每...
【2021】最新封装免签版苹果APP+文字安装说明 在移动应用开发领域,尤其是iOS平台,苹果公司对应用的发布有着严格的规范,通常开发者需要通过App Store进行审核才能让应用上线。然而,"封装免签版苹果APP"提供了一...
同时,安全编码实践也很重要,避免因修改源码引入新的安全漏洞。 10. **测试与调试**:封装后,需要进行详尽的测试,包括单元测试、集成测试和用户体验测试,确保新功能的正常运行,以及应用的稳定性和兼容性。 11...
教你简单的在win7系统下集成系统漏洞并封装.doc
5. 安全性:确保解析过程不引入安全漏洞,如防止XXE(XML External Entity)攻击。 在我们的案例中,"XmlDll"可能是一个包含了XML解析封装的动态链接库。它可能提供了易于使用的函数或类,开发者只需调用这些接口...
它定义了如何封装信息,以及如何处理请求和响应。 - **组合变异**:指在测试过程中同时改变多个参数,以模拟真实场景下的复杂交互情况。这种方法可以有效发现单个变异无法检测到的漏洞。 ##### 2. 组合测试策略 - ...
先下载一个PE→找一台测试机安装原版XP→安装常用软件如office、PDF等(根据需要,最好安装一个驱动精灵带网卡驱动版)→打系统漏洞补丁→使用该工具封装→重启之后不要进系统使用PE引导→制作当前系统状态GHOST→将...
面向对象编程(OOP)的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism)。类是对象的蓝图,定义了属性(Attributes)和方法(Methods),对象则是类的...
- 关注`WebView`的安全更新,避免使用已知漏洞的旧版本。 通过上述方式,我们可以全面掌握`WebView`的使用,并实现高效、安全的封装。在实际开发中,根据项目需求,可以进一步扩展和定制`WebView`的功能。
可以考虑使用面向对象的设计原则,将每个扫描任务封装为单独的类,以便于管理和扩展。 【挑战与注意事项】 1. **性能限制**:VB在处理大量并发请求时可能会遇到性能瓶颈,可能需要优化代码或使用更强大的网络库。 ...
"亲测无后门,随便搭建一下自己封装苹果app吧"意味着源码已经过测试,确认没有安全漏洞,并且用户可以轻松地部署自己的服务来封装和分发苹果应用,而无需经过Apple官方的审核流程。 【标签】"苹果免签,ios免费打包...
2. **参数验证**:通过在调用API之前验证参数,可以防止因无效或恶意输入导致的安全漏洞。例如,确保字符串长度正确,数值类型符合预期等。 3. **安全的内存管理**:API调用可能涉及内存分配和释放,封装类可以确保...
7. **安全性**:遵循最佳实践,如使用预处理语句防止SQL注入,设置合适的字符集以避免乱码问题,以及定期更新数据库驱动以修复已知的安全漏洞。 在压缩包中的`mysql封装类`文件,很可能是包含了以上所述功能的PHP类...
和开发的迭代几进几出,仍然漏洞无数! 浪费时间就等于浪费生命!我几乎无法忍受这样的事情。于是我们决定把许多复杂而频 繁的工作封装成二次开发组件,大大简化开发工作,同时也提供开发的安全性,缩短开发周 ...
### 文件包含漏洞的原理与实践 #### 一、文件包含漏洞概述 文件包含漏洞是一种常见的Web应用程序安全漏洞,尤其在使用PHP语言开发的应用程序中较为普遍。这种漏洞允许攻击者通过控制程序中用于指定要包含文件的...
6. **安全性考虑**:在处理文件上传时,应防止恶意文件注入,如通过文件名包含漏洞执行恶意代码。类可能会对上传文件名进行重命名,例如使用时间戳或者随机字符串,以避免冲突和安全问题。 7. **Demo示例**:`demo....
在Vulhub中,每个漏洞环境都被封装在单独的Docker容器中,这样可以确保测试环境的隔离性和一致性,同时也简化了环境的部署和管理。 5. **学习资源**: "vulhub-master"可能包含了详细的使用指南、漏洞描述、PoC...
7. **struts2漏洞利用工具.tpk**:这可能是一个特定于Struts2漏洞的测试工具,封装在一个Talend数据包中,方便导入到相应环境中运行。 8. **lib**:这个目录可能包含了各种库文件,攻击者会检查这些库是否为易受...
- 防范策略包括:将涉及身份验证的部分封装在服务器端,减少在ASP文件中的明文暴露;为数据库连接使用的账户分配最小权限,只允许执行存储过程,禁止直接修改、插入和删除记录。 2. **验证被绕过**: - 单纯的...