JavaSE java.lang.reflect.Proxy
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
] [
Trackback(0)
]
開始行:
#contents
*概要 [#sc2cf0ba]
-メソッドの機能を拡張する Proxy クラスのフレームワーク
-できることは [[AspectJ>AspectJ ログ]] と同じ
--AspectJ の方が使いやすいかも・・・
-java.lang.reflect.Proxy は、Java 標準機能で、バイトコー...
*拡張するクラス例 [#ne4628d2]
-EmployeeDAO.java (DAO)
#code(java){{
package com.snail.proxyexam;
public interface EmployeeDAO {
Employee create(Employee emp);
Employee findById(String id);
void update(Employee emp);
void delete(String id);
}
}}
-Employee.java (Entity)
#code(java){{
package com.snail.proxyexam;
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = -4149357...
private String id;
private String name;
private String sex;
public Employee(String id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String toString() {
return "{" + id + "," + name + "," + sex + "}";
}
}
}}
----
-EmplyeeDAOImpl.java&br;
DAO の実装クラスは次のようなニセコード。本番では JPA など...
#code(java){{
package com.snail.proxyexam;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class EmployeeDAOImpl implements EmployeeDAO {
// DBのつもり
private static final Map<String, Employee> mockDB;
static {
mockDB = Collections.synchronizedMap(new HashMap<...
mockDB.put("1234", new Employee("1234", "はる は...
mockDB.put("2345", new Employee("2345", "やまだ ...
}
@Override
public Employee create(Employee emp) {
emp.setId("9999");
mockDB.put(emp.getId(), emp);
System.out.println(emp.getId() + "をDB登録しまし...
return emp;
}
@Override
public Employee findById(String id) {
System.out.println(id + "をDB検索しました");
return mockDB.get(id);
}
@Override
public void update(Employee emp) {
mockDB.put(emp.getId(), emp);
System.out.println(emp.getId() + "をDB更新しまし...
}
@Override
public void delete(String id) {
mockDB.remove(id);
System.out.println(id + "をDB削除しました");
}
}
}}
*java.lang.reflect.Proxy による拡張 [#rca8de1c]
-Proxy を使って、EmployeeDAO を拡張し、ehcache に検索結果...
-DAOFactory.java
#code(java){{
package com.snail.proxyexam;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.commons.beanutils.PropertyUtils;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
public class DAOFactory {
@SuppressWarnings("unchecked")
public static <T> T createProxy(Class<T> inf, final T...
return (T) Proxy.newProxyInstance(obj.getClass()....
new Class[]{inf}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method met...
Object[] args) throws Throwable {
if (method.getName().startsWith("create")...
Object retObj = method.invoke(obj, ar...
addOrUpdateCache(retObj);
return retObj;
} else if (method.getName().startsWith("f...
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
Element element = cache.get(args[0]);
if (element == null) {
Object retObj = method.invoke(obj...
addOrUpdateCache(retObj);
return retObj;
} else {
System.out.println("おめでとうご...
return element.getObjectValue();
}
} else if (method.getName().startsWith("u...
Object retObj = method.invoke(obj, ar...
addOrUpdateCache(args[0]);
return retObj;
} else if (method.getName().startsWith("d...
Object retObj = method.invoke(obj, ar...
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
cache.remove(args[0]);
System.out.println(args[0] + "をキャ...
return retObj;
}
return method.invoke(obj, args);
}
private void addOrUpdateCache(Object obj) {
if (obj == null) {
return;
}
try {
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
Object id = PropertyUtils.getProperty...
cache.put(new Element(id, obj));
System.out.println(id + "をキャッシュ...
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
}
}}
--Object Proxy.newProxyInstance(ClassLoader cl,Class[] if...
|cl |ClassLoader|
|ifs |newProxyInstanceの返値Objectは、ここで列挙した...
|hander |処理クラス|
--Object InvocationHandler.invoke(Object proxy, Method me...
---処理メソッド。method.invoke(obj,args); で目的のメソッ...
---その前後に共通的な付帯処理を入れる (AOP と同じことがで...
---proxy には、newProxyInstance() で動的に構築されれた Pr...
method.invoke(proxy,args); とやると、 proxy は method を...
*Ehcacheについて [#h7087a42]
-http://ehcache.org/
-Java Object のキャッシュ
--クラスタ対応 (分散キャッシュではなく、すべてのインスタ...
--JTA 対応
-使い方
++キャッシュの作成
CacheManager manager = CacheManager.getInstance();
Cache cache = manager.getCache("EntityCache");
---Classpath直下にある ehcache.xml の設定を元に Cache を...
#code(jsp){{
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="EntityCache"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
</ehcache>
}}
---CacheManager.getInstance(); の引数に、フルパスでファイ...
---CacheManager は、Singleton なので、設定ファイルの読み...
++登録・更新
cache.put(new Element(key, value));
++取得
Element element = cache.get(key);
++削除
cache.remove(key);
*実行 [#f2e9567d]
-実行コード
#code(java){{
package com.snail.proxyexam;
public class App {
public static void main(String[] args) {
EmployeeDAO dao = DAOFactory.createProxy(Employee...
System.out.println("***** 検索処理(1) *****");
Employee emp1 = dao.findById("1234");
System.out.println(emp1);
System.out.println("***** 更新処理 *****");
emp1.setName("あき はなこ");
dao.update(emp1);
System.out.println("***** 検索処理(2) *****");
Employee emp2 = dao.findById("1234");
System.out.println(emp2);
System.out.println("***** 削除処理 *****");
dao.delete("1234");
System.out.println("***** 検索処理(3) *****");
Employee emp3 = dao.findById("1234");
System.out.println(emp3);
}
}
}}
-実行結果
***** 検索処理(1) *****
1234をDB検索しました
1234をキャッシュに登録しました
{1234,はる はなこ,female}
***** 更新処理 *****
1234をDB更新しました
1234をキャッシュに登録しました
***** 検索処理(2) *****
おめでとうございます!!! キャッシュにヒットしました。DB検...
{1234,あき はなこ,female}
***** 削除処理 *****
1234をDB削除しました
1234をキャッシュから削除しました
***** 検索処理(3) *****
1234をDB検索しました
null
|||DB|Cache|h
|1|***** 検索処理(1) *****|検索|登録|
|2|***** 更新処理 ***** |更新|更新|
|3|***** 検索処理(2) *****|----|読出|
|4|***** 削除処理 ***** |削除|削除|
|5|***** 検索処理(3) *****|検索|----|
----
[[Java]]
終了行:
#contents
*概要 [#sc2cf0ba]
-メソッドの機能を拡張する Proxy クラスのフレームワーク
-できることは [[AspectJ>AspectJ ログ]] と同じ
--AspectJ の方が使いやすいかも・・・
-java.lang.reflect.Proxy は、Java 標準機能で、バイトコー...
*拡張するクラス例 [#ne4628d2]
-EmployeeDAO.java (DAO)
#code(java){{
package com.snail.proxyexam;
public interface EmployeeDAO {
Employee create(Employee emp);
Employee findById(String id);
void update(Employee emp);
void delete(String id);
}
}}
-Employee.java (Entity)
#code(java){{
package com.snail.proxyexam;
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = -4149357...
private String id;
private String name;
private String sex;
public Employee(String id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String toString() {
return "{" + id + "," + name + "," + sex + "}";
}
}
}}
----
-EmplyeeDAOImpl.java&br;
DAO の実装クラスは次のようなニセコード。本番では JPA など...
#code(java){{
package com.snail.proxyexam;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class EmployeeDAOImpl implements EmployeeDAO {
// DBのつもり
private static final Map<String, Employee> mockDB;
static {
mockDB = Collections.synchronizedMap(new HashMap<...
mockDB.put("1234", new Employee("1234", "はる は...
mockDB.put("2345", new Employee("2345", "やまだ ...
}
@Override
public Employee create(Employee emp) {
emp.setId("9999");
mockDB.put(emp.getId(), emp);
System.out.println(emp.getId() + "をDB登録しまし...
return emp;
}
@Override
public Employee findById(String id) {
System.out.println(id + "をDB検索しました");
return mockDB.get(id);
}
@Override
public void update(Employee emp) {
mockDB.put(emp.getId(), emp);
System.out.println(emp.getId() + "をDB更新しまし...
}
@Override
public void delete(String id) {
mockDB.remove(id);
System.out.println(id + "をDB削除しました");
}
}
}}
*java.lang.reflect.Proxy による拡張 [#rca8de1c]
-Proxy を使って、EmployeeDAO を拡張し、ehcache に検索結果...
-DAOFactory.java
#code(java){{
package com.snail.proxyexam;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.commons.beanutils.PropertyUtils;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
public class DAOFactory {
@SuppressWarnings("unchecked")
public static <T> T createProxy(Class<T> inf, final T...
return (T) Proxy.newProxyInstance(obj.getClass()....
new Class[]{inf}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method met...
Object[] args) throws Throwable {
if (method.getName().startsWith("create")...
Object retObj = method.invoke(obj, ar...
addOrUpdateCache(retObj);
return retObj;
} else if (method.getName().startsWith("f...
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
Element element = cache.get(args[0]);
if (element == null) {
Object retObj = method.invoke(obj...
addOrUpdateCache(retObj);
return retObj;
} else {
System.out.println("おめでとうご...
return element.getObjectValue();
}
} else if (method.getName().startsWith("u...
Object retObj = method.invoke(obj, ar...
addOrUpdateCache(args[0]);
return retObj;
} else if (method.getName().startsWith("d...
Object retObj = method.invoke(obj, ar...
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
cache.remove(args[0]);
System.out.println(args[0] + "をキャ...
return retObj;
}
return method.invoke(obj, args);
}
private void addOrUpdateCache(Object obj) {
if (obj == null) {
return;
}
try {
CacheManager manager = CacheManager.g...
Cache cache = manager.getCache("Entit...
Object id = PropertyUtils.getProperty...
cache.put(new Element(id, obj));
System.out.println(id + "をキャッシュ...
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
}
}}
--Object Proxy.newProxyInstance(ClassLoader cl,Class[] if...
|cl |ClassLoader|
|ifs |newProxyInstanceの返値Objectは、ここで列挙した...
|hander |処理クラス|
--Object InvocationHandler.invoke(Object proxy, Method me...
---処理メソッド。method.invoke(obj,args); で目的のメソッ...
---その前後に共通的な付帯処理を入れる (AOP と同じことがで...
---proxy には、newProxyInstance() で動的に構築されれた Pr...
method.invoke(proxy,args); とやると、 proxy は method を...
*Ehcacheについて [#h7087a42]
-http://ehcache.org/
-Java Object のキャッシュ
--クラスタ対応 (分散キャッシュではなく、すべてのインスタ...
--JTA 対応
-使い方
++キャッシュの作成
CacheManager manager = CacheManager.getInstance();
Cache cache = manager.getCache("EntityCache");
---Classpath直下にある ehcache.xml の設定を元に Cache を...
#code(jsp){{
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="EntityCache"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
</ehcache>
}}
---CacheManager.getInstance(); の引数に、フルパスでファイ...
---CacheManager は、Singleton なので、設定ファイルの読み...
++登録・更新
cache.put(new Element(key, value));
++取得
Element element = cache.get(key);
++削除
cache.remove(key);
*実行 [#f2e9567d]
-実行コード
#code(java){{
package com.snail.proxyexam;
public class App {
public static void main(String[] args) {
EmployeeDAO dao = DAOFactory.createProxy(Employee...
System.out.println("***** 検索処理(1) *****");
Employee emp1 = dao.findById("1234");
System.out.println(emp1);
System.out.println("***** 更新処理 *****");
emp1.setName("あき はなこ");
dao.update(emp1);
System.out.println("***** 検索処理(2) *****");
Employee emp2 = dao.findById("1234");
System.out.println(emp2);
System.out.println("***** 削除処理 *****");
dao.delete("1234");
System.out.println("***** 検索処理(3) *****");
Employee emp3 = dao.findById("1234");
System.out.println(emp3);
}
}
}}
-実行結果
***** 検索処理(1) *****
1234をDB検索しました
1234をキャッシュに登録しました
{1234,はる はなこ,female}
***** 更新処理 *****
1234をDB更新しました
1234をキャッシュに登録しました
***** 検索処理(2) *****
おめでとうございます!!! キャッシュにヒットしました。DB検...
{1234,あき はなこ,female}
***** 削除処理 *****
1234をDB削除しました
1234をキャッシュから削除しました
***** 検索処理(3) *****
1234をDB検索しました
null
|||DB|Cache|h
|1|***** 検索処理(1) *****|検索|登録|
|2|***** 更新処理 ***** |更新|更新|
|3|***** 検索処理(2) *****|----|読出|
|4|***** 削除処理 ***** |削除|削除|
|5|***** 検索処理(3) *****|検索|----|
----
[[Java]]
ページ名:
ISBN10
ISBN13
9784061426061