概要
StringBuider で append() を使い1文字を追加するとき、
sb.append('\t');
のように char 型を追加するときと
sb.append("\t");
のように文字列型で追加するときに性能差を調査した。結果
| 追加データ | 実行時間 [s] |
|---|---|
| '\t' | 2.165 |
| "\t" | 7.788 |
sb.append('\t');
のように char 型を追加するときと
sb.append("\t");
のように文字列型で追加するときに性能差を調査した。| 追加データ | 実行時間 [s] |
|---|---|
| '\t' | 2.165 |
| "\t" | 7.788 |
| 項目 | 値 |
|---|---|
| OS | Windows XP Pro SP3 |
| IDE 環境 | Eclipse 3.4.1(Preiades All in One) |
| Java | JDK 6 update 10 |
public class Test {
public static void main(String[] args) throws InterruptedException {
int count = 0;
for (;;) {
Thread.sleep(1000);
count++;
System.out.println(count);
}
}
}
とりあえず1回実行してみる。C:\Program Files\Java\jre6\lib\management の下にある、次の2つのファイルを C:\ にコピーする。
snmp.acl.template は snmp.acl に名前を変える。
acl = {
{
communities = public
access = read-only
managers = 172.16.1.2
}
}
com.sun.management.snmp.interface=172.16.1.3
$ snmpwalk -v 2c -c public 172.16.1.3 .1 -On | less次のような内容が出力される。
.1.3.6.1.4.1.42.2.145.3.163.1.1.1.1.0 = Gauge32: 729 .1.3.6.1.4.1.42.2.145.3.163.1.1.1.4.0 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.1.0 = Gauge32: 0 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.2.0 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.3.0 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.1 = STRING: "CodeCacheManager" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.2 = STRING: "Copy" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.3 = STRING: "MarkSweepCompact" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.1 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.2 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.3 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.1 = STRING: "Code Cache" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.2 = STRING: "Eden Space" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.3 = STRING: "Survivor Space" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.4 = STRING: "Tenured Gen" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.5 = STRING: "Perm Gen" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.6 = STRING: "Perm Gen [shared-ro]" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.7 = STRING: "Perm Gen [shared-rw]" .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.2 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.3 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.4 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.1 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.2 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.5 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.6 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.7 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.1 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.2 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.3 = INTEGER: 1 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.4 = INTEGER: 2 .1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.5 = INTEGER: 2 ...なお、-v で指定する SNMP バージョンは 2c を指定する必要がある。
package jp.trasis.sample.service;
import javax.persistence.EntityManager;
import jp.trasis.sample.entity.User;
import org.seasar.extension.tx.annotation.RequiresNewTx;
import org.seasar.framework.container.annotation.tiger.Binding;
public class TestService {
@Binding
private EntityManager entityManager;
@RequiresNewTx
public void test(Long userId, String name) {
User user = (User) entityManager.createNativeQuery(
"select * from User_ where id=:userId for update", User.class)
.setParameter("userId", userId)
.getSingleResult();
user.setName(name);
entityManager.persist(user);
}
}
| 項目 | 内容 |
|---|---|
| Eclipse バージョン | 3.3.2 3.4.1 |
workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.core.runtime.prefs
content-types/org.eclipse.wst.javascript.core.javascriptsource/charset=
| 項目 | 値 |
|---|---|
| OS | Windows XP Pro SP2 |
| IDE 環境 | Eclipse 3.3.2(Preiades All in One) |
| Java | JDK 6 update 6 |
| DB | PostgreSQL 8.3 |
| 項目 | 値 |
|---|---|
| OS | Windows XP Pro SP2 |
| IDE 環境 | Eclipse 3.3.2(Preiades All in One) |
| Java | JDK 6 update 6 |
| DB | PostgreSQL 8.3 |
hibernate-entitymanager が必要。commons-logging と log4j も指定。
DB に PostgreSQL を使うので postgresql を指定。
作成するエンティティの中で ToStringBuilder を使用するので、 commons-lang を指定。
設定ファイル作成
まず、maven のルールに従い、リソースファイル置き場 src/main/resources フォルダを作成する。
- プロジェクト test の上で右クリック、[新規] ⇒ [ソース・フォルダー] を選択する。
- フォルダー名に「
src/main/resources」と入力して [終了] ボタンを押す。
作成するファイルは次の3つ。
- META-INF/persistence.xml
- ehcache.xml
- log4j.properties
META-INF/persistence.xml
persistence.xml は JPA の設定ファイル。
src/main/resources フォルダの中に META-INF フォルダを作成。その中に作成する。
org.hibernate.ejb.HibernatePersistence
いくつか設定項目いついて解説。詳しい設定項目についてはこちら
hibernate.cache.provider_class で二次キャッシュ機能を提供してくれるクラスを指定する。
hibernate.cache.use_query_cache はクエリキャッシュ機能を有効にするかどうか。
キャッシュしたくないクエリに対しては次のように設定する。
Query query = entityManager.createNativeQuery("...", User.class);
query.setHint("org.hibernate.cacheable", Boolean.FALSE);
または
((HibernateQuery) query).getHibernateQuery().setCacheable(false);
hibernate.cache.use_second_level_cache で、二次キャッシュ機能を有効(true)に設定している。
バッチ処理などで大量の insert や update を行う場合(Bulk Insert/Bulk Update)は、ここを false にしておいた方が、余計なキャッシュ処理でメモリや CPU リソースを消費せずに済むらしい。
hibernate.hbm2ddl.auto は、実行時にテーブルなどの作成を行うかどうか。開発中は update、運用時は none、開発環境で作り直すときは create-drop を指定するとよい。
- update を指定すると、テーブルなどが存在しなければ自動的に作成。
- create-drop を指定すると、削除して再作成する。
- none を指定すると、何もしない。
hibernate.show_sql は、実行された SQL をログに出力するかどうか。開発時にチューニングを行う時に true、それ以外は false を指定するといい。
ehcache.xml
src/main/resources フォルダの中に作成する。
log4j.properties
src/main/resources フォルダの中に作成する。
log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d] %c: %p: %m%n
エンティティ作成
ここまでで環境構築は終了。次にエンティティを作成する。
BaseEntity クラス作成
まずは、全てのエンティティのベースとなる BaseEntity を作成する。
src/main/java フォルダの中で test.test.entity パッケージを作成し、その中に BaseEntity クラスを作成する。
ついでに自動的に作成された App クラスは不要なので、消しておく。
package test.test.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import org.apache.commons.lang.builder.ToStringBuilder;
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createTimestamp;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@Version
private Date updateTimestamp;
@PrePersist
protected void updateCreateTimestamp() {
this.createTimestamp = new Date();
}
@PreUpdate
public void updateUpdateTimestamp() {
this.updateTimestamp = new Date();
}
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (getClass() != obj.getClass()) return false;
BaseEntity entity = (BaseEntity) obj;
if (entity.getId() == id) return true;
return false;
}
@Override
public int hashCode() {
return id != 0 ? (int) id : super.hashCode();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Date getCreateTimestamp() {
return createTimestamp;
}
public void setCreateTimestamp(Date createTimestamp) {
this.createTimestamp = createTimestamp;
}
public Date getUpdateTimestamp() {
return updateTimestamp;
}
public void setUpdateTimestamp(Date updateTimestamp) {
this.updateTimestamp = updateTimestamp;
}
}
User クラス作成
続いて、User エンティティを作成する。
@Entity アノテーションを設定すると、JPA が自動的に「このクラスはエンティティである」と判断してくれる。
テーブル名は User_ とする。
mailAddress, hashedPassword フィールドを持つ。BaseEntity を継承しているので、id, createTimestamp, updateTimestamp も持つ。
mailAddress にはユニークキーを @UniqueConstraint で設定している。
@Column(nullable = false) で mailAddress, hashedPassword フィールドは null のまま DB に追加できないよう設定している。
package test.test.entity;
@Entity(name = "Users")
public class User extends BaseEntity {
private static final long serialVersionUID = 1L;
@Column(nullable = false, length = 255, unique = true)
private String mailAddress;
@Column(nullable = false, length = 32)
private String password;
public String getMailAddress() {
return mailAddress;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String hashedPassword) {
this.password = hashedPassword;
}
}
利用プログラム作成
insert - エンティティ追加
まずはデータの追加を行うプログラム。
src/test/java フォルダの test.test パッケージの中に InsertSample クラスを作成する。
DB に対して insert や update などを行うときはトランザクションの中で行う。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import test.test.entity.User;
public class InsertSample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
User user = new User();
user.setMailAddress("test1@example.com");
user.setHashedPassword("test");
em.persist(user);
tx.commit();
} finally {
em.close();
}
}
}
select - ネイティブクエリによる検索
次は SelectSample1 クラスを作成。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import test.test.entity.User;
public class SelectSample1 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
String sql = "select * from user_ where mailAddress=?";
User user = (User) em.createNativeQuery(sql, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println(user);
em.close();
}
}
select - HSQL による検索
次の SelectSample2 クラスでは HSQL による検索を行っている。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import test.test.entity.User;
public class SelectSample2 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
String sql = "from User_ where mailAddress=?";
User user = (User) em.createQuery(sql)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println(user);
em.close();
}
}
update - データ更新
次の UpdateSample1 クラスではオブジェクトの値を書き換えることで更新を行っている。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import test.test.entity.User;
public class UpdateSample1 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
String sql = "select * from user_ where mailAddress=?";
User user = (User) em.createNativeQuery(sql, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println(user);
user.setHashedPassword("test4");
em.persist(user);
tx.commit();
} finally {
em.close();
}
}
}
update - ネイティブクエリによる更新
次の UpdateSample2 クラスではネイティブクエリによる更新処理を行っている。
生成される SQL を見ると分かるように、自分でネイティブクエリを書いたほうが最適な更新処理を行える。
ただし、1つの EntityManager セッションの中でキャッシュされているオブジェクトの値とずれが生じている点に注意。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import test.test.entity.User;
public class UpdateSample2 {
private static final String SELECT_SQL = "select * from user_ where mailAddress=?";
private static final String UPDATE_SQL = "update user_ set hashedPassword=? where id=?";
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
User user = (User) em.createNativeQuery(SELECT_SQL, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println("[1]" + user);
em.createNativeQuery(UPDATE_SQL)
.setParameter(1, "test5")
.setParameter(2, user.getId())
.executeUpdate();
tx.commit();
user = (User) em.createNativeQuery(SELECT_SQL, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println("[2]" + user);
} finally {
em.close();
}
em = emf.createEntityManager();
User user = (User) em.createNativeQuery(SELECT_SQL, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println("[3]" + user);
em.close();
}
}
delete - エンティティの削除
次の DeleteSample ではエンティティを削除している。
package test.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import test.test.entity.User;
public class DeleteSample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
String sql = "select * from user_ where mailAddress=?";
User user = (User) em.createNativeQuery(sql, User.class)
.setParameter(1, "test1@example.com")
.getSingleResult();
System.out.println(user);
em.remove(user);
tx.commit();
} finally {
em.close();
}
}
}
参考文献
ByteArrayOutputStream に書き出し、実行時間を測定する。
public class Test1_2 {
public static void main(String[] args) throws IOException {
String s = "The quick brown fox jumps over the lazy dog";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(s);
}
Charset charset = Charset.forName("iso-8859-1");
long t = System.currentTimeMillis();
for (int i = 0; i < 20000 * 80; i++) {
doTest(s, charset);
}
long t2 = System.currentTimeMillis();
System.out.println((t2 - t) + " msec");
}
private static void doTest(String s, Charset charset) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(
new ByteArrayOutputStream(), charset);
out.write(s);
out.close();
}
}
| 実行時間[msec] | 文字コード |
|---|---|
| 4374 | us-ascii |
| 4375 | iso-8859-1 |
| 4531 | UTF-8 |
| 5406 | MS932 |
| 6954 | EUC-JP |
| 実行時間[msec] | 文字コード |
|---|---|
| 4829 | UTF-8 |
| 6359 | MS932 |
| 7500 | EUC-JP |
| 実行時間[msec] | 文字コード |
|---|---|
| 5960 | us-ascii |
| 5974 | iso-8859-1 |
| 5999 | UTF-8 |
| 6378 | MS932 |
| 7503 | EUC-JP |
| 実行時間[msec] | 文字コード |
|---|---|
| 6093 | UTF-8 |
| 6620 | MS932 |
| 7503 | EUC-JP |
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import javax.net.ssl.HttpsURLConnection;
public class Test1 {
public static void main(String[] args) throws Exception {
String href = "https://www.example.com/";
String encoding = "UTF-8";
URLConnection connection = new URL(href)
.openConnection();
HttpsURLConnection httpsconnection = (HttpsURLConnection) connection;
int responseCode = httpsconnection.getResponseCode();
System.out.println(responseCode);
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpsconnection.getInputStream(), encoding));
String buffer;
while ((buffer = reader.readLine()) != null) {
System.out.println(buffer);
}
}
}
発生するエラー
Caused by: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class Test2 {
public static void main(String[] args) throws Exception {
String href = "https://www.example.com/";
String encoding = "UTF-8";
URLConnection connection = new URL(href).openConnection();
HttpsURLConnection httpsconnection = (HttpsURLConnection) connection;
// SSL 証明書検証をしない。
ignoreValidateCertification(httpsconnection);
int responseCode = httpsconnection.getResponseCode();
System.out.println(responseCode);
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpsconnection.getInputStream(), encoding));
String buffer;
while ((buffer = reader.readLine()) != null) {
System.out.println(buffer);
}
}
private static void ignoreValidateCertification(
HttpsURLConnection httpsconnection)
throws NoSuchAlgorithmException, KeyManagementException {
KeyManager[] km = null;
TrustManager[] tm = { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(km, tm, new SecureRandom());
httpsconnection.setSSLSocketFactory(sslcontext.getSocketFactory());
}
}
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
public class HttpClientTest1 {
public static void main(String[] args) throws Exception {
String href = "https://www.example.com/";
HttpClient httpClient = new HttpClient();
GetMethod method = new GetMethod(href);
int retCode = httpClient.executeMethod(method);
System.out.println(retCode);
byte[] buf = method.getResponseBody();
System.out.write(buf);
}
}
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
/**
* テスト2: 証明書チェックを行わない。
*
*/
public class HttpClientTest2 {
private static void initHttpClient() {
// 証明書チェックを行わない。
Protocol.registerProtocol("https", new Protocol("https",
new MySSLSocketFactory(), 443));
}
public static void main(String[] args) throws Exception {
// HttpClient の初期設定。
initHttpClient();
String href = "https://www.example.com/";
HttpClient httpClient = new HttpClient();
GetMethod method = new GetMethod(href);
int retCode = httpClient.executeMethod(method);
System.out.println(retCode);
byte[] buf = method.getResponseBody();
System.out.write(buf);
}
}
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
public class MySSLSocketFactory implements SecureProtocolSocketFactory {
private SSLContext sslcontext = null;
private static SSLContext createEasySSLContext() {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, null);
return context;
} catch (Exception e) {
throw new HttpClientError(e.toString());
}
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createEasySSLContext();
}
return this.sslcontext;
}
@Override
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(socket, host,
port, autoClose);
}
@Override
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress clientHost,
int clientPort) throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(host, port,
clientHost, clientPort);
}
@Override
public Socket createSocket(String host, int port, InetAddress localAddress,
int localPort, HttpConnectionParams params) throws IOException,
UnknownHostException, ConnectTimeoutException {
if (params == null) {
throw new IllegalArgumentException("Parameters may not be null");
}
int timeout = params.getConnectionTimeout();
SocketFactory socketfactory = getSSLContext().getSocketFactory();
if (timeout == 0) {
return socketfactory.createSocket(host, port, localAddress,
localPort);
} else {
Socket socket = socketfactory.createSocket();
SocketAddress localaddr = new InetSocketAddress(localAddress,
localPort);
SocketAddress remoteaddr = new InetSocketAddress(host, port);
socket.bind(localaddr);
socket.connect(remoteaddr, timeout);
return socket;
}
}
}
test-1: new Foo() で生成 (引数なし)
test-1-2: new Foo(int)
test-2: Class.newInstance() で生成
test-3: Constructor.newInstance() で生成
test-3-2: Constructor.newInstance(int) で生成
test-4: Foo.newInstance() をリフレクションで実行
test-4-2: Foo.newInstance(int)
| テストケース | 引数なし [msec] | 引数あり [msec] |
|---|---|---|
| test-1 | 125 | 172 |
| test-2 | 3344 | |
| test-3 | 3281 | 3891 |
| test-4 | 1984 | 2625 |