包访问控制、类搜索路径

探讨Java中类封装的重要性及包访问限制机制,解释如何通过包封闭避免属性访问问题,并详细阐述Java类的包名规则及类路径的确定过程。文章深入分析了Java虚拟机类加载器的作用,以及不当使用classpath可能导致的混淆与问题。

由于时间上的紧迫性或者程序员忘记了private字段,经常忘记了加入private修饰符对类的字段进行修饰(面向对象的封装推荐我们的字段都声明为private)。这样是否会带来危险性?

实际上这个是依赖与包是否已经被封上了。在Java1.2之后,package java --> 凡是以java或者javax开头的自己的类时,都会被Java的虚拟机拦截,避免恶意代码访问java.awt等包中的default字段。以下的代码展现了:我们无法使用 package java.awt, Java虚拟机的类加载器每当碰到有声明为java开头的包,都是不允许的。

View Code
package java.awt;
public class Window extends Container{
     String warningString;
     ...
}


package java.awt;
public class hostileClass{
     public void accessWindowWarningString(){
         ...
         win.warningString = "trust me";   
     }
}

然而本身的项目代码无法受到Java虚拟机的类加载器的帮助,然而可以将自己的代码进行包的封闭来避免包访问属性的问题

 

类的包名确定了对应类文件的目录结构:如, package com.baidu; 那么这个类是存在于对应的基类的路径 com/baidu/

 

类是我们编程的基本单元..所以虚拟机能够找到对应的类是虚拟机正确执行的最基本的条件,为了能够找到对应的辅助类,实际上Java平台正是通过classpath的协助来完成的..实际上当虚拟机完成部署到某个系统之后,系统默认的将jdk安装目录下的lib/*.jar 和 jdk安装目录/jre/lib/*.jar的所有jar文件加入到我们的类路径当中。同时由于有这样默认的假定:当我们没有指定我们的classpath时,系统给我们默认指定了:

1. jdk安装目录/lib/*.jar

2. jdk安装目录/jre/lib/*.jar

3. 目前运行java虚拟机的当前目录

import java.util.*;
import java.sql.*;

import java.util.Date;

public class ImportClassDemo{
     
      private String importClassName;
      private Date currentDate;
      private List<String> importArrayList;
}

 

首先根据import语句定位出对应类的:包名.类名(java.lang包是系统默认的加载进来的包)。

当代码中引用某个类时,Java编译器将尝试着去寻找:

1. java.lang.String, java.lang.Date,java.lang.List,显然在找String类的事后成功了.

2. 然后根据import java.util.*,会转到寻找:Java.util.String,java.util.Date,java.sql.List

3. 然后根据import java.sql.*,会转到寻找:java.sql.String,java.sql.Date,java.sql.List

4. 在相同包的目录开始搜索String,Date,List

5. 由于在2,3步中都找到了匹配的Date类,所以为了唯一的确定类,在import的最后一句加入了import java.util.Date.明确的使用util包里面的Date类

两个classpath被误用的两个习惯:

1. 设置classpath的值,永久的(Windows -> 我的电脑->属性->高级->环境变量) 这个习惯并不是十分的确当,因为一般而言都习惯每次都使用java -cp(-classpath) classpath (推荐使用.bat(windows) .sh (linux) ) 这样的话语义更加清晰,否则当classNoDefFound的error的时候,错误无从说起。

2. 将所有的引用的代码库的类库,都加入到JDK安装目录中\lib\ext目录中:这个诚然是种比较偷懒的方法,然而这里带来的问题是:当这个项目比较长期,那么实际上很容易就忘记了自己曾经把类库加入到了这个目录,而且对于不同的项目需求的类不同.搜索的范围被最大化。

 

 

 

转载于:https://www.cnblogs.com/papertigerv5/archive/2012/09/28/2707859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值