public java.security.cert.Certificate certToX509Cert(X509Certificate cert) {
为桓台等地区用户提供了全套网页设计制作服务,及桓台网站建设行业解决方案。主营业务为成都网站建设、网站建设、桓台网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
try {
CertificateFactory cf = new CertificateFactory();
InputStream is = new ByteArrayInputStream(cert.getEncoded());
Collection coll = cf.engineGenerateCertificates(is);
java.security.cert.Certificate jcrt = null;
Iterator it = coll.iterator();
if (it.hasNext()) {
jcrt = (java.security.cert.Certificate) it.next();
return jcrt;
}
} catch (CertificateEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public int storeP12(String caCertPath, String certPath, String pemPath, String pemPassword,
String p12Path, String p12Password) {
KeyPair kp;
try {
kp = getPrivateKey(pemPath, pemPassword);
X509Certificate caCert = getCertificate(caCertPath);
X509Certificate cert = getCertificate(certPath);
java.security.cert.Certificate[] chain = new java.security.cert.Certificate[2];
chain[0] = certToX509Cert(cert);
chain[1] = certToX509Cert(caCert);
KeyStore ks = KeyStore.getInstance("PKCS12", "BC");
ks.load(null, null);
ks.setKeyEntry(parseCertDN(cert.getSubjectDN().getName(), "CN"),
kp.getPrivate(), null, chain);
FileOutputStream fOut = new FileOutputStream(p12Path);
ks.store(fOut, p12Password.toCharArray());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
blog.csdn点虐 /jinhill/article/details/17612273
java泛型是1.5引进的一个新概念.
本题对于"? super T"和"? extends T",我从书上摘个经典的例子给你看看,如果不能理解,那么你就参考以下书籍慢慢体会,循序渐进!
"? super T"和"? extends T",都是java泛型通配符,而用法又有区别,
还有super 和extends 不是java类关系数御中的超类和继承的意思,他是通配符的下限和上限限制.
下面看一个通配符得高级用法:
在这一部分,我们来考虑一些通配符得高级用法。我们已经看到了上限通配符在从一个数据结构中进行读取的几个例子。现在考虑相反的情况,一个只写的数据结构。
接口Sink是这种情况的一个简单例子。
interface SinkT {
void flush(T t);
}
我们可以想象他被如下面的代码一样使用。方法writeAll() 被设计来把集合coll的所有元素flush到sink snk,并且返回最后一个flush的元素。
public static T T writeAll(CollectionT coll, SinkT snk) {
T last = null;
for (T t : coll) {
last = t;
snk.flush(last);
}
return last;
}
SinkObject s;
CollectionString cs;
String str = writeAll(cs, s); // 非法的调用!!
像上面所写,writeAll() 的调用是非法的,因为没有有效的类型参数可以被推断出来。String 或 Object都不是T的合适的类型,因为Collection的元素和 Sink的元素必须是同样的类型。
我们可以解决这个问题,通过使用通配符来修改writeAll()的方法签名,如下:
T T writeAll(Collection? extends T coll, SinkT snk)
String str = writeAll(cs, s); //可以调用但是返回值类型错误
这个调用现在是合法的,但是赋值产生错误,因为推断出的返回值类型是 Object因为T 匹配了Sink的类型,Object。
解决方案是使用一种我们还没有见过的有限制的通配符:有下限的通配符。语法 ? super T 表示T的一个未知的父类(或者是T自己)。这跟我们用? extends T 表示T的一个未知的子类是对应的。
T T writeAll(CollectionT coll, Sink? super T snk)
String str = writeAll(cs, s); // YES!!!
使用这个语法,这个调用是合法的,推断出来的T是String,正是我们想要的。
现在让我们看一个更现实的例子。一个 java.util.TreeSetE 代表一个有序的元素是E类型的树。创建一个TreeSet的一个方法是传递一个 Comparator 对象给构造函数。这个Comparator将会用来按照需要对TreeSet进行排序。
TreeSet(ComparatorE c)
Comparator 接口是核心:
interface ComparatorT
假定我们要创建一个 TreeSetString 并传递一个合适的 Comparator,我们需要传一个能比较String的Comparator。这可以是一个 ComparatorString,也可以是一个 ComparatorObject。然而我们不能用ComparatorObject来调用上面的构造函数。我们可以使用一个有下限的通配符来得到我们需要的灵活性:
TreeSet(Comparator? super E c)
这允许任何可用的Comparator被传递进去。
作为使用下限友此通配符最终的例子,让我们来看看方法 Collections.max(),它返回一个集合中的最大的元素。
现在,为了让max()能工作,传进来的集合中的所有元素必须实现 Comparatable接口。而且,他们必须薯告岩都能够被彼此比较(all be comparable to each other)。第一个尝试是:
public static T extends ComparableT T max(CollectionT coll)
就是说,方法的参数是某一个能和自己进行比较的T的集合。这限制太严格了。
为什么?考虑一个能和任何对象进行比较的类型:
class Foo implements ComparableObject ...
CollectionFoo cf = ...;
Collections.max(cf); // 应该能工作
cf 中的每个元素都可以和每个cf中的其他元素进行比较,因为每个这样的元素都是一个Foo,它可以和任意的对象进行比较,也可以和另一个Foo进行比较。
但是,使用上面的方法签名,我们发现这个调用被拒绝。推断出来的类型必须是Foo,但是Foo没有实现接口 ComparableFoo。
T 精确的(exactly)和自己能比较是不需要的。所需要的是 T能够和它的父类中的一个进行比较,这导出:(注:Collections.max()的实际方法签名更复杂,我们在第10部分再讨论。)
public static T extends Comparable? super T T max(CollectionT coll)
这个推论对大多数想让 Comparable 对任意类型生效的用法中都有效:你总是应该使用 Comparable? super T。
总之,如果你有一个只使用类型参数T作为参数的API,它的使用应该利用下限通配符( ? super T )的好处。相反的,如果API只返回T,你应该使用上限通配符( ? extends T )来给你的客户端更大的灵活性。
(原文:This reasoning applies to almost any usage of Comparable that is intended to work for arbitrary types: You always want to use Comparable? super T.
In general, if you have an API that only uses a type parameter T as an argument, its uses should take advantage of lower bounded wildcards (? super T). Conversely, if the API only returns T, you'll give your clients more flexibility by using upper bounded wildcards (? extends T). )。
如果你想比较深刻的了解java泛型那么
建议你看看Java1.5泛型指南
中文链接地址:
英文pdf格式地址:
Java实现短信自动发送功能主要是用httpclient实现的,要有发短信的端口。
1、硬件设备是一个3G网卡;
2、软件方面需要sun提过的java底层通信common包;
3、此外还需要第三方库SMSLib,这个是开源项目,主要用于实现java发短信的功能;
主要代码如下:
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(
"");
post.addRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");// 在头文件中设置转码
NameValuePair[] data = { new NameValuePair("sname", "*****"),
new NameValuePair("spwd", "*****"),
new NameValuePair("scorpid", "*****"),
new NameValuePair("sprdid", "*****"),
new NameValuePair("sdst", "*****"),
new NameValuePair("smsg", "*****") };
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:" + statusCode);
for (Header h : headers) {
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println(result);
post.releaseConnection();
Java源程序(.java文件)——java字节码文件(.class文件)——由解释执行器(java.exe)将字节码文件加载到java虚拟机(jvm)——字节码文件(.class)就会在java虚拟机中执行。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语察碧简言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独败裤立与可移慧芦植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等