1

好的,这是我的疑问...

我有一个带有一些类的blazeDS(tomcat)应用程序,每个类都使用ConfigandDB类进行配置和数据库连接......

这是一个例子

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),我从数据库中收到错误...

那么,static final编译版本中的值(用户/密码)是否直接保存在类本身中(在我的情况下为 DB.class)???

4

3 回答 3

4

简而言之,是的。

Java 规范的摘录:

“对作为常量变量的字段(第 4.12.4 节)的引用在编译时解析为表示的常量值。二进制文件的代码中不应存在对此类字段的引用(类或包含该字段的接口,该字段将具有初始化它的代码)。此类字段必须始终看起来已初始化(第 12.4.2 节);不得观察此类字段类型的默认初始值。请参阅第 13.4 节.9 进行讨论。” (第 339 页)

于 2012-07-31T09:12:32.460 回答
0

那么,编译版本中的静态最终值(用户/通行证)是否直接保存在类本身中(在我的情况下为 DB.class)???

是的,任何最终变量都被字节码中的字面值替换。

于 2012-07-31T09:09:09.657 回答
0

作为“编译时常量”的静态最终变量(常量)在其目的地内联。

so if you use the constant in several classes those classes are affected. if you for some reason don't deploy all the affected classes bad things happen and your old values are still used.

于 2012-07-31T09:19:04.527 回答