Meinst Du den String-Literal-Pool? Was hat der mit dem Passwortfeld zu tun?war das nicht eher was hinsichtlich String-Cache in Java?
Also wäre jetzt folgendes richtig:
[Java]
JPasswordField tf1 = new JPasswordField(10);
...
char[] pw = tf1.getPassword();
String passwort = new String(pw);
[/Java]
Sorry, dass ich das nochmal aufgreife. Was ist "String-caching"? Den Begriff kenne ich nicht und er geht auch nicht aus der Seite oben hervor. Ich kenne den Literal-Pool und mit dem hat's nichts zu tun. Bitte erklär's mir.> der String aber unverändert darauf warten muss, dass ihn irgendwann der GC erwischt.
es erwischt ihn nicht wegen des String-Caches
edit:
jedenfalls potentiell nicht so schnell
Ja.wenn dieses, auch irgendwo als String vorliegt, wäre dies ja dann genauso auch Blödsinn oder?!
:autsch: Bin ich Dir auf den Schlips getreten? Das war nicht meine Absicht! Hast meinen Nachtrag oben noch gelesen?und auf die Tour sage ich nichts weiter, wenn du Argumente dagegen hast dann erkläre doch deine Sichtweise
/** das Literal "abc" liegt im Pool */
final String s1 = "abc";
/**
* das Literal "def" liegt im Pool, die Instanz auf die die Referenz s2
* verweist liegt nicht im Pool
*/
final String s2 = new String("def");
/**
* die Literale "a", "b" und "ab" liegen im Pool, da der Compiler die
* String-Konkatenation von Literalen selbst ausführt
*/
final String s3 = "a" + "b";
/**
* die Literale "a", "b" und "a1b" liegen im Pool, da auch 1 ein Literal ist
*/
final String s4 = "a" + 1 + "b";
Du bist einfach zu schnell.wie auch in deinem Nachtrag, sag ich doch, erkläre es einfach![]()
:autsch: Bin ich Dir auf den Schlips getreten? Das war nicht meine Absicht! Hast meinen Nachtrag oben noch gelesen?
Der Literal-Pool beinhaltet alle String-Instanzen die im ByteCode als Literal vorkommen. Dafür ist er da. Was ein Literal ist, entscheidet der Compiler. Beispiel:Java:/** das Literal "abc" liegt im Pool */ final String s1 = "abc"; /** * das Literal "def" liegt im Pool, die Instanz auf die die Referenz s2 * verweist liegt nicht im Pool */ final String s2 = new String("def"); /** * die Literale "a", "b" und "ab" liegen im Pool, da der Compiler die * String-Konkatenation von Literalen selbst ausführt */ final String s3 = "a" + "b"; /** * die Literale "a", "b" und "a1b" liegen im Pool, da auch 1 ein Literal ist */ final String s4 = "a" + 1 + "b";
Wenn Du aber einen Text in ein JTextComponent-Derivat eingibst, von einer URL lädst, per Random erzeugst, etc., dann handelt es sich nicht um Literale. Deswegen gibt es auch keinen Passworttext im Literal-Pool, es sei denn jemand ruft String.intern() auf dem Passwort-String auf; was natürlich niemand macht.
Ich halte die namentliche Unterscheidung zwischen einem Cache und einem Literal-Pool für sehr wichtig. Cache bedeutet, dass eine gewisse Menge an Information zeitlich oder mengenmäßig begrenzt zur Wiederverwendung vorgehalten wird. Der Literal-Pool enthält alle Literale ab ihrer ersten Verwendung; diese Literale verlassen den Pool nie wieder.
Nachtrag
Du bist einfach zu schnell.Auch dieser Beitrag bezog sich noch auf den Vorgänger. :-D
Ebenius
String password = String.valueOf(char[] pas);
use(password);
password = "Pech gehabt";
Obejktneuzuweisung bewirkt nicht, dass der GC das alte löscht
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.*;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
public class MD5Test extends JFrame {
private JPasswordField field;
public MD5Test() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
field = new JPasswordField(30);
field.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
printHash(field.getPassword().toString());
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
add(field);
setSize(100, 50);
setLocationRelativeTo(null);
setVisible(true);
}
private void printHash(String s) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.reset();
md5.update(s.getBytes());
byte[] result = md5.digest();
/* Ausgabe */
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < result.length; i++) {
hexString.append(Integer.toHexString(0xFF & result[i]));
}
System.out.println(hexString.toString());
}
public static void main(String[] args) {
new MD5Test();
}
}
Ne, so war's nicht gemeint. Ich hatte tatsächlich befürchtet, es gibt irgendwas in der Java-6-VM was aus irgendeinem Grund klüger ist und sich String-Cache nennt. Tut mir leid.ich erklär nochmal meine falsche Sichtweise genauer und dann kannst du sie noch genauer widerlegen
char[] cArray = null;
final CharBuffer cBuffer = CharBuffer.wrap(cArray);
final ByteBuffer bBuffer = Charset.forName("UTF-16").encode(cBuffer);
final byte[] bArray = bBuffer.array();
Arrays.fill(cArray, '\u0000');
// ... hier den Digest ermitteln
Arrays.fill(bArray, 0);