访问java中私有类内声明的变量

时间:2013-02-14 22:58:20

标签: java class private accessor

这是我的代码。

private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String username = "";
    String sql = "select * from userinfo where uname=? and pword=?";
    try{
        pst = conn.prepareStatement(sql);
        pst.setString(1, txt_username.getText());
        pst.setString(2, txt_password.getText());

        rs=pst.executeQuery();
        if(rs.next()){
            afterLogin pwcorrect = new afterLogin();
            pwcorrect.setVisible(true);
            this.setVisible(false);
            username = txt_username.getText();
        }
        else{
            JOptionPane.showMessageDialog(null, "Username and Password are Incorrect.");
        }
    }
    catch(Exception e){

        JOptionPane.showMessageDialog(null, e);
    }
}

我需要从另一个类访问username的值。这有什么办法吗???请帮我代码。

2 个答案:

答案 0 :(得分:3)

这不仅仅是在类中定义的,它是在类中的方法中定义的。

这不是“私有”变量(或类),就其他类而言,它是不可见变量。用公共getter公开它,或提供代码可以在其他东西上设置它的机制。

由于这是一个动作处理程序,你还需要确保变量只有在设置之后才能被访问,或者它被访问时可以处理它而不是有一个值。


public class WhateverClassThisIs {

    private String username;

    public String getUsername() { return username; }

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String sql = "select * from userinfo where uname=? and pword=?";
        try {
            // As before, but:
            if (rs.next()) {
                username = txt_username.getText();
            }
        }
    }
}

public class SomeOtherClass {

    private WhateverClassThisIs theOtherClass;

    public void setTheOtherClass(WhateverClassThisIs theOtherClass) {
        this.theOtherClass = theOtherClass;
    }

    public void whatever() {
        String username = theOtherClass.getUsername();
    }
}

另一种机制依赖于使用用户名设置器将内容传递给WhateverClassThisIs,大致如下:

public class WhateverClassThisIs {

    private SomeOtherClass someOtherClass;

    public WhateverClassThisIs(SomeOtherClass someOtherClass) {
        this.someOtherClass = someOtherClass;
    }

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String sql = "select * from userinfo where uname=? and pword=?";
        try {
            // As before, but:
            if (rs.next()) {
                someOtherClass.setUsername(txt_username.getText());
            }
        }
    }
}

public class SomeOtherClass {

    private String username;

    public void setUsername(String username) {
        this.username = username;
    }

    public void whatever() {
        // Do something with username--but either try
        // after you know it's been set, or by being
        // able to handle it being null/empty/whatever
    }
}

此外,您可以使用Observer,几种Swing-ish机制中的任何一种,依此类推。

答案 1 :(得分:0)

是的,有方法可以使用反射...如果变量是一个字段。

但最好的解决方案是更改另一个类,以便在您考虑完所有含义之后,它具有可访问的getter和/或setter方法。

打破类封装以访问私有状态是你应该只作为最后的手段。


如果变量是局部变量,那么其他类或方法无法更新它。如果该类是本地声明的匿名内部类,并且该变量声明为final,则只能从另一个类访问它。这听起来不像你在这里想做的那样......