提交 cdd269f4 编写于 作者: M mullan

8035004: Provider provides less service

Reviewed-by: wetmore, skoivu
上级 6d3e5208
/*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -1372,7 +1372,7 @@ public abstract class Provider extends Properties {
* <p>This class defines the methods {@link #supportsParameter
* supportsParameter()} and {@link #newInstance newInstance()}
* which are used by the Java security framework when it searches for
* suitable services and instantes them. The valid arguments to those
* suitable services and instantiates them. The valid arguments to those
* methods depend on the type of service. For the service types defined
* within Java SE, see the
* <a href="../../../technotes/guides/security/crypto/CryptoSpec.html">
......@@ -1562,7 +1562,7 @@ public abstract class Provider extends Properties {
*
* @throws InvalidParameterException if the value of
* constructorParameter is invalid for this type of service.
* @throws NoSuchAlgorithmException if instantation failed for
* @throws NoSuchAlgorithmException if instantiation failed for
* any other reason.
*/
public Object newInstance(Object constructorParameter)
......@@ -1590,7 +1590,9 @@ public abstract class Provider extends Properties {
+ " engines");
}
Class<?> clazz = getImplClass();
return clazz.newInstance();
Class<?>[] empty = {};
Constructor<?> con = clazz.getConstructor(empty);
return con.newInstance();
} else {
Class<?> paramClass = cap.getConstructorParameterClass();
if (constructorParameter != null) {
......@@ -1633,13 +1635,18 @@ public abstract class Provider extends Properties {
} else {
clazz = cl.loadClass(className);
}
if (!Modifier.isPublic(clazz.getModifiers())) {
throw new NoSuchAlgorithmException
("class configured for " + type + " (provider: " +
provider.getName() + ") is not public.");
}
classRef = new WeakReference<Class<?>>(clazz);
}
return clazz;
} catch (ClassNotFoundException e) {
throw new NoSuchAlgorithmException
("class configured for " + type + "(provider: " +
provider.getName() + ")" + "cannot be found.", e);
("class configured for " + type + " (provider: " +
provider.getName() + ") cannot be found.", e);
}
}
......@@ -1652,15 +1659,21 @@ public abstract class Provider extends Properties {
throws Exception {
Class<?> clazz = getImplClass();
if (constructorParameter == null) {
Object o = clazz.newInstance();
return o;
// create instance with public no-arg constructor if it exists
try {
Class<?>[] empty = {};
Constructor<?> con = clazz.getConstructor(empty);
return con.newInstance();
} catch (NoSuchMethodException e) {
throw new NoSuchAlgorithmException("No public no-arg "
+ "constructor found in class " + className);
}
}
Class<?> argClass = constructorParameter.getClass();
Constructor[] cons = clazz.getConstructors();
// find first public constructor that can take the
// argument as parameter
for (int i = 0; i < cons.length; i++) {
Constructor<?> con = cons[i];
for (Constructor<?> con : cons) {
Class<?>[] paramTypes = con.getParameterTypes();
if (paramTypes.length != 1) {
continue;
......@@ -1668,10 +1681,9 @@ public abstract class Provider extends Properties {
if (paramTypes[0].isAssignableFrom(argClass) == false) {
continue;
}
Object o = con.newInstance(new Object[] {constructorParameter});
return o;
return con.newInstance(constructorParameter);
}
throw new NoSuchAlgorithmException("No constructor matching "
throw new NoSuchAlgorithmException("No public constructor matching "
+ argClass.getName() + " found in class " + className);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册