考虑以下代码:
String first = "abc";
String second = new String("abc");
Run Code Online (Sandbox Code Playgroud)
使用new关键字时,Java会abc String再次创建吗?这会存储在常规堆还是String池中?多少人String在将s结尾String池?
Swing的JPasswordField有getPassword()一个返回字符数组的方法.我对此的理解是,数组可以在使用后立即归零,这样你就不会在内存中长时间存在敏感的东西.检索密码的旧方法是使用getText(),它返回一个String对象,但它已被弃用.
所以,我的问题是为什么Java在检索过程中实际使用它getPassword()?为了更清楚,我正在调试我的测试应用程序的其他东西**,我跟着调用和爆炸... getText()在JPasswordField被调用,当然,一个很好的String对象与我的密码已经创建,现在挂在内存.
亲自尝试一下:
public class PasswordTest() {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPasswordField passField = new JPasswordField();
pass.addActionListener(new ActionListener() {
public ActionPerformed(ActionEvent evt) {
char[] p = passField.getPassword(); // put breakpoint
// do something with the array
}
});
frame.add(passField);
frame.setVisible(true);
frame.pack();
}
}
Run Code Online (Sandbox Code Playgroud)
跟进问题:这种"隐藏"的getText()危险用途是什么?当然,如果一个专门的攻击者破坏了系统,它会获得你的密码,我说的是一个不那么专注的密码;)
**我在寻找一种在不使用String对象的情况下在Swing组件上实际显示一些敏感数据的方法时遇到了这个问题.显然除非我愿意重写Swing API的部分(全部?),否则无法做到这一点.不会发生.
我正在尝试制作一个小游戏,首先会向玩家展示一个简单的登录界面,他们可以输入他们的名字(我稍后需要它来存储他们的游戏状态信息),让他们选择一个难度级别等,并且只会一旦玩家点击了播放按钮,就会显示主游戏画面.我也想让玩家导航到一个(希望对于他们相当大的)奖杯收藏,同样在他们看来是一个新的屏幕.
到目前为止,我有一个主要的游戏窗口,其中有一个网格布局和一个有效的游戏(Yay for me!).现在我想添加上述功能.
我该怎么做呢?我不认为我想要去多个JFrame路线,因为我一次只想在任务栏中看到一个图标(或者将它们的可见性设置为假图标也是如此?)我是否制作并销毁布局或面板或者这样的事情?
我有什么选择?如何控制正在显示的内容?特别是考虑到我的新手技巧?
根据上述问题的答案,我理解的是创建一个String包含密码的对象是一种安全威胁,因为它可能会在内存中保留一段时间而且是不可变的.
所以我想知道,
检索一直挂在内存中的东西,没有引用或遗漏垃圾收集是多么容易?
你是怎么做到的?
编辑
由于问题已经结束,请善意通过添加评论来分享您的知识,如果您认为将来可能会得到有趣的答案,请考虑重新打开问题.:)
我有一个主框架,我想用卡片布局在中心位置显示我的NewUser类的对象.这是我的主要课程
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardLayoutDemo implements ItemListener {
JPanel cards; //a panel that uses CardLayout
final static String BUTTONPANEL = "Card with JButtons";
final static String TEXTPANEL = "Card with JTextField";
public void addComponentToPane(Container pane) {
//Put the JComboBox in a JPanel to get a nicer look.
JPanel comboBoxPane = new JPanel(); //use FlowLayout
String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL };
JComboBox cb = new JComboBox(comboBoxItems);
cb.setEditable(false);
cb.addItemListener(this);
comboBoxPane.add(cb);
//Create the "cards".
NewUser newUser = …Run Code Online (Sandbox Code Playgroud)