JAva学習ノート-クラスMyInputStreamを実現(28)
14432 ワード
1クラスMyInputStreamのファイル読み取りを実現し、異常を放出できない
2以下は包装によりclose方法の修正を実現し、接続を回収する
1:Connectionインタフェースを実装し、Connectionのメンバーを1つ持つ.
2:closeメソッドを変更します.
3:他のメソッドはメンバー変数のconnectionを呼び出します.
次のパッケージ
3、get方式の文字化けしをパッケージで処理する
まとめ:
1:エージェントまたはパッケージは、クラスのメソッドを強化します.
エージェント:指定されたインタフェースに基づいて、このインタフェースのサブクラスをメモリに作成する必要があります.$Proxy0.
パッケージ:インタフェースは必要ありませんが、クラスを宣言し、パッケージされたクラスのサブクラスになり、パッケージされたクラスのメンバーを持つことを宣言します.
2:エージェント基本コード:
Object proxyedObj =
Proxy.newProxyInstance(ClassLoader,
New class[]{エージェントされるクラスのインタフェース配列.class}
New InvocationHandler(){//実行ハンドル
Public Object invode(Objectエージェント、Methodメソッド反射、object[]args){
Reutrn method.invode(被エージェントクラス、args);
}
}
3:包装:
クラスがクラスのパッケージクラスである場合:
A extends B{
Privet B b;
}
4:どのような場合、パッケージを使用し、どのような場合にエージェントを使用するか
公式(SUN)にパッケージアダプタが提供されている場合は、パッケージを優先的に使用する必要があります.HttpServeretRequestのように、そのパッケージクラスはHtpServeretRequestWraperである.
パッケージクラスのアダプタが公式に提供されていない場合は、ダイナミックエージェントを使用できます.接続の場合.
public class TestDemo {
public static void main(String[] args) throws Exception {
InputStream in = new MyInputStream("d:/a/a.txt");
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
String s = new String(b,0,len);
System.err.print(s);
}
in.close();
}
}
class MyInputStream extends InputStream { // inputstream , is a.
private InputStream in;
public MyInputStream(String fileName) {
try {
in = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public int read(byte[] b){
int len=-1;
try {
len = in .read(b);
} catch (IOException e) {
e.printStackTrace();
}
return len;
}
public void close(){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int read() throws IOException {
return 0;
}
}
2以下は包装によりclose方法の修正を実現し、接続を回収する
1:Connectionインタフェースを実装し、Connectionのメンバーを1つ持つ.
2:closeメソッドを変更します.
3:他のメソッドはメンバー変数のconnectionを呼び出します.
public class MyDataSource implements DataSource {
private LinkedList<Connection> pool = new LinkedList<Connection>();
public MyDataSource() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
for (int i = 0; i < 3; i++) {
// ,// com.mysql.jdbc.JDBC4Connection@8888
Connection con = DriverManager.getConnection(url, "root",
"1234");
//
MyConn conn = new MyConn(con);
pool.add(conn);//
}
} catch (Exception e) {
e.printStackTrace();
}
}
// datasource,
public Connection getConnection() throws SQLException {
synchronized (pool) {
if (pool.size() == 0) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
Connection con = pool.removeFirst();
System.err.println("siize:" + pool.size());
return con;
}
}
次のパッケージ
class MyConn implements Connection {
//
private Connection conn; //com.mysql.jdbc.Jdbc4Connection@1111
// MySql connection JDBC4Connection@8888
public MyConn(Connection con) {
this.conn = con;
}
//
public void close() throws SQLException {
synchronized (pool) {
// ,
System.err.println(" 。。。。"+this);
pool.add(this);
pool.notify();
}
}
}
3、get方式の文字化けしをパッケージで処理する
package cn.itcast.utils;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String methodName = req.getParameter("cmd");
try{
Method mm = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//
MyRequest mr = new MyRequest(req);
mm.invoke(this,mr,resp);
}catch(Exception e){
e.printStackTrace();
}
}
}
// request
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest req;
public MyRequest(HttpServletRequest request) {
super(request);
this.req=request;
}
// getparameter
@Override
public String getParameter(String name) {
String value = req.getParameter(name);
if(req.getMethod().equals("GET")){
System.err.println(" ");
try{
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
}catch(Exception e){
}
}
return value;
}
}
まとめ:
1:エージェントまたはパッケージは、クラスのメソッドを強化します.
エージェント:指定されたインタフェースに基づいて、このインタフェースのサブクラスをメモリに作成する必要があります.$Proxy0.
パッケージ:インタフェースは必要ありませんが、クラスを宣言し、パッケージされたクラスのサブクラスになり、パッケージされたクラスのメンバーを持つことを宣言します.
2:エージェント基本コード:
Object proxyedObj =
Proxy.newProxyInstance(ClassLoader,
New class[]{エージェントされるクラスのインタフェース配列.class}
New InvocationHandler(){//実行ハンドル
Public Object invode(Objectエージェント、Methodメソッド反射、object[]args){
Reutrn method.invode(被エージェントクラス、args);
}
}
3:包装:
クラスがクラスのパッケージクラスである場合:
A extends B{
Privet B b;
}
4:どのような場合、パッケージを使用し、どのような場合にエージェントを使用するか
公式(SUN)にパッケージアダプタが提供されている場合は、パッケージを優先的に使用する必要があります.HttpServeretRequestのように、そのパッケージクラスはHtpServeretRequestWraperである.
パッケージクラスのアダプタが公式に提供されていない場合は、ダイナミックエージェントを使用できます.接続の場合.