阅读密码学,无法理解为什么指示的代码行打印数据:
Provider p[] = Security.getProviders()
for (int i = 0; i < p.length; i++) {
System.out.println(p[i]); // <<<--- THIS LINE
为什么打印出数据,如果它不是字符串,则是提供者对象
感谢。
答案 0 :(得分:5)
因为println()
接受了很多类型,所以此方法有很多签名,例如:
println(int i){...} //when you set int you call this
println(String i){...} //when you set String you call this
println(boolean i){...} //when you set boolean you call this
println(char i){...} //when you set char you call this
println(java.lang.Object i){...} //when you set Object you call this
... and so on
答案 1 :(得分:1)
编辑:Java中的所有类(其中大多数类如下所述,谢谢)都有toString()方法,它返回一个对象的String表示,同样适用于Provider类。编写自己的类时,可以覆盖toString()方法,这意味着您可以编写名为toString()的方法,只要您尝试以String形式访问该对象,就会调用该方法(例如,在System.out.println()中)。
希望这有帮助,如果不是,只需google toString()。
答案 2 :(得分:1)
基本上,println()
调用Object的toString()
方法(即Provider toString()
)来打印对象的字符串表示。 (如果Provider类已实现toString()
,则继承自Object类的默认toString()
Javadoc link
:https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(java.lang.Object)
public void println(Object x)
打印一个对象,然后终止该行。此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。
参数:
x - 要打印的对象。
如果Object(即你的情况下是提供者)类没有覆盖默认的java.lang.Object的类toString()
那么它会显示什么?
它实际上打印了类名+“@”符号+ Object的hashcode方法的十六进制值。 (hashcode也继承自Object类)
public class Solution {
private int i;
public Solution() {
this.i = 10;
}
public static void main(String... args) {
Solution solution = new Solution();
System.out.println(solution);
// what is default toString prints?
System.out.println(Integer.toHexString(solution.hashCode()));
}
}
示例运行
Solution@5eba06ff
5eba06ff
如果Object(即你的情况下是提供者)覆盖了默认的java.lang.Object类toString()
那么它会显示什么?
它实际上打印了你打算在toString()中打印的内容。
public class Solution {
private int i;
public Solution() {
this.i = 10;
}
@Override
public String toString() {
return "Solution [i=" + i + "]";
}
public static void main(String... args) {
Solution solution = new Solution();
System.out.println(solution);
}
}
示例运行
Solution [i=10]
答案 3 :(得分:0)
在java中,每当我们尝试1.直接打印对象2.或者直接用字符串连接对象时,会自动调用 toString方法。默认情况下,字符串打印类名@ hashcode
与您的示例中一样, p[i].toString()
正在发生。
因为,对象类是直接或间接的每个类的父类,所以它的所有11个函数(包括toString())都在子类中继承。
Provider类重写Hashtable<Object,Object>
类中的toString()函数。 此重写的toString()返回一个字符串,其中包含此提供程序的名称和版本号。
答案 4 :(得分:0)
公共类ExamineSecurity {
public static void main(String args[]) {
try {
Provider p[] = Security.getProviders();
for (int i = 0; i < p.length; i++) {
System.out.println(p[i]);
for (Enumeration e = p[i].keys(); e.hasMoreElements();)
System.out.println("\t" + e.nextElement());
}
}
catch (Exception e) {
System.out.println(e);
}
}
}
如果我们使用1.2 Sun安全提供程序运行此程序,我们将获得此输出:
班级定义
SUN版本1.2 Alg.Alias.MessageDigest.SHA
Alg.Alias.Signature.SHAwithDSA
Alg.Alias.Signature.1.3.14.3.2.13
Alg.Alias.Signature.OID.1.2.840.10040.4.3
Alg.Alias.Signature.SHA-1/DSA
Alg.Alias.Signature.DSS
Alg.Alias.Signature.SHA1withDSA
Alg.Alias.Signature.OID.1.3.14.3.2.13
AlgorithmParameters.DSA
KeyFactory.DSA
Alg.Alias.Signature.1.2.840.10040.4.3
Alg.Alias.MessageDigest.SHA1
AlgorithmParameterGenerator.DSA
Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1
MessageDigest.MD5
Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1
MessageDigest.SHA-1
Alg.Alias.KeyPairGenerator.OID.1.3.14.3.2.12
Signature.DSA
Alg.Alias.KeyPairGenerator.1.3.14.3.2.12
Alg.Alias.KeyPairGenerator.1.2.840.10040.4.1
Alg.Alias.Signature.1.3.14.3.2.27
Alg.Alias.Signature.SHA/DSA
从这个例子中可以看出两件事。首先,仅包含引擎名称和算法的字符串实现了我们在表8-1中列出的预期操作。其次,正如我们在Provider类的部分中提到的,安全提供程序通常利用Provider类是Properties类的子类的事实,以提供仅对作为提供程序包一部分的其他类有意义的属性。因此,签名算法1.3.14.3.2.13可能对Sun安全提供程序中的一个类but it is not a string that will necessarily not make sense to other developers. In fact, those aliases--including the ones that are prefaced by OID--do have meanings within the cryptography standards world
有意义,但出于我们的目的,我们将坚持使用前面列出的标准算法名称。
答案 5 :(得分:-2)
类Provider的toString()方法似乎已实现。