好的,这是我的疑问......
我有一个带有一些类的blazeDS(tomcat)应用程序,每个Class使用Config
和DB
类进行配置和数据库连接......
以下是
的示例 Config
类
public class Config {
public static final String DBClass = "oracle.jdbc.driver.OracleDriver";
public static final String ConnectString = "jdbc:oracle:thin:@//127.0.0.1:1521/xe";
public static final String UserDB = "user";
public static final String PasswordDB = "pass";
}
DB
班级
public class DB
{
public DB() {}
public static Connection dbConnect(Connection c)
{
try
{ if (c == null || c.isClosed()){
Class.forName(Config.DBClass);
c = DriverManager.getConnection(Config.ConnectString,Config.UserDB,Config.PasswordDB);
}
return c;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return null;
}
}
public static void closeConnection(Connection connection) throws SQLException
{
if (!connection.isClosed())
connection.close();
}
}
我有一个测试和生产环境,每个数据库访问具有不同的用户/密码..
我注意到在使用测试类更新生产文件时(我没有覆盖Config.class
),我收到了来自DB的错误...
那么,编译版本中的static final
值(用户/密码)是否直接保存在类本身中(在我的例子中是DB.class)???
答案 0 :(得分:4)
简而言之,是的。
摘自Java specs:
“参考 对于作为常量变量的字段(第4.12.4节),解析为 编译时到表示的常量值。没有参考 这样的字段应该存在于二进制文件的代码中(除了 包含该字段的类或接口,它将具有代码 初始化它)。这样的领域似乎总是如此 初始化(§12.4.2);此类型的默认初始值 绝不能观察到一个场。有关讨论,请参见§13.4.9。“(p。 339)
答案 1 :(得分:0)
那么,是否保存了编译版本中的静态最终值(user / pass) 直接在类本身(在我的例子中DB.class)???
是的,任何最终变量都会被字节码中的文字值替换。
答案 2 :(得分:0)
静态最终变量(常量)是“编译时间常量”,它们的目的地是内联的。
所以如果你在几个类中使用常量,那么这些类会受到影响。如果由于某种原因没有部署所有受影响的类,则会发生坏事,并且仍然使用旧值。