- 浏览: 236098 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (101)
- Practice (17)
- Model (15)
- Prototype (2)
- Integration (6)
- GWT (3)
- Android (16)
- Lab (6)
- Ubuntu (4)
- Data Structure(D,S) (1)
- 社会观察员 (1)
- python (14)
- redis (0)
- mysql (9)
- php (0)
- Data Structure(D (1)
- haproxy (2)
- Shell (5)
- Zabbix (1)
- CentOS (1)
- sqlplus (1)
- rlwrap (1)
- Oracle (2)
- schema (2)
- user (1)
- accredit (1)
- Delphi (2)
- nagios (1)
- nginx (0)
最新评论
-
白云飞:
兄弟能不能发一份完整的源码到我邮箱?luochengwei20 ...
【Python真的很强大】程序Log实时监控 -
myreligion:
nice job!
解决一个棘手的bug: java.lang.NoClassDefFoundError: android.os.AsyncTask -
yw9002:
你这个貌似提交的时候整个页面都会刷新。
AjaxAnyWhere+Struts的一个应用(demo/feature crew) -
fkpwolf:
这总结偏向于细节了,流水账
Android app项目和开发总结 -
crazybull:
期待详细总结~~~
Android app项目和开发总结
本文来自csdn:
http://topic.csdn.net/u/20071030/08/fa2e15dd-1abe-46dc-b76e-9fe2de4e7381.html
问题描述:有这样一个需求,有一个Hashtable存储着一些东西,而且已经序列化到了硬盘上,假如这个Hashtable发生了变化,就将这个新的Hashtable重新序列化到硬盘上,前提是并不知道哪些方法会改变这个Hashtable,这该怎么实现呢?
bao110908[火龙果]:最嘉的答案.
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Hashtable; import java.util.Map; public class HashtableProxyTest { public static void main(String[] args) { Map<String, String> table = new Hashtable<String, String>(); HashtableHandler handler = new HashtableHandler(); table = handler.bind(table); table.put("abc", "abc"); Map t1 = WriteFile.readFile(); System.out.println(t1.size()); m(table); t1 = WriteFile.readFile(); System.out.println(t1.size()); String abc = table.get("abc"); t1 = WriteFile.readFile(); System.out.println(t1.size()); System.out.println(abc); table.remove("abc"); t1 = WriteFile.readFile(); System.out.println(t1.size()); table.clear(); t1 = WriteFile.readFile(); System.out.println(t1.size()); } public static void m(Map<String, String> map) { map.put("123", "123"); } } class WriteFile { private static File file = new File("Hashtable.obj"); public static void writeFile(Map<String, String> map) { try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(map); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @SuppressWarnings("unchecked") public static Map<String, String> readFile() { Map map = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); map = (Map<String, String>)in.readObject(); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return map; } } class HashtableHandler implements InvocationHandler { private Map<String, String> table = null; @SuppressWarnings("unchecked") public Map<String, String> bind(Map<String, String> map) { table = map; Map<String, String> mapProxy = (Map<String, String>)Proxy.newProxyInstance( table.getClass().getClassLoader(), table.getClass().getInterfaces(), this ); return mapProxy; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; // 调用原有的方法 obj = method.invoke(table, args); String name = method.getName(); String changeMethod = "(clear)|(put)|(putAll)|(remove)"; // 当调用的方法为更改 map 中值的方法时,写入文件中 if(name.matches(changeMethod)) { WriteFile.writeFile(table); } return obj; } }
问题描述: 构造连接池。
来源:http://blog.csdn.net/Coolongxp/archive/2005/04/28/366107.aspx
实现了InvocationHandler接口的
Object invoke(Object proxy, Method method, Object[] args)
的方法的类可以作为InvocationHandler类的参数来构建Proxy类的实例
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
ConnectionWrapper(Connection con) { Class[] interfaces = { java.sql.Connection.class}; this.connection = (Connection) Proxy.newProxyInstance( con.getClass().getClassLoader(), interfaces, this); m_originConnection = con; }
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; if (CLOSE_METHOD_NAME.equals(m.getName())) { DBConnectionPool.pushConnectionBackToPool(this); } else { obj = m.invoke(m_originConnection, args); } if (DEBUG) { System.out.println(m.getName()+"is invoke!"); } lastAccessTime = System.currentTimeMillis(); return obj; }
作用说明:
当调用被代理的类(Connection)的实例的方法时系统将转到包含代理类(Proxy)的InvocationHandler的invoke方法中去执行相应代码。
这样就可以在不修改代码的前提下为已经存在的类来添加新的功能。
如:(全部代码参看DBConnectionPool.java)
import java.sql.*; import java.lang.reflect.*; import java.util.*; import java.io.*; public class DBConnectionPool { private static LinkedList m_notUsedConnection = new LinkedList(); private static HashSet m_usedUsedConnection = new HashSet(); private static String m_url = ""; private static String m_user = ""; private static String m_password = ""; static final boolean DEBUG = true; static private long m_lastClearClosedConnection = System.currentTimeMillis(); public static long CHECK_CLOSED_CONNECTION_TIME = 4 * 60 * 60 * 1000; //4 hours static { initDriver(); } private DBConnectionPool() { } private static void initDriver() { Driver driver = null; //load mysql driver try { driver = (Driver) Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); installDriver(driver); } catch (Exception e) { } //load postgresql driver try { driver = (Driver) Class.forName("org.postgresql.Driver").newInstance(); installDriver(driver); } catch (Exception e) { } } public static void installDriver(Driver driver) { try { DriverManager.registerDriver(driver); } catch (Exception e) { e.printStackTrace(); } } public static synchronized Connection getConnection() { clearClosedConnection(); while (m_notUsedConnection.size() > 0) { try { ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection. removeFirst(); if (wrapper.connection.isClosed()) { continue; } m_usedUsedConnection.add(wrapper); if (DEBUG) { wrapper.debugInfo = new Throwable("Connection initial statement"); } return wrapper.connection; } catch (Exception e) { } } int newCount = getIncreasingConnectionCount(); LinkedList list = new LinkedList(); ConnectionWrapper wrapper = null; for (int i = 0; i < newCount; i++) { wrapper = getNewConnection(); if (wrapper != null) { list.add(wrapper); } } if (list.size() == 0) { return null; } wrapper = (ConnectionWrapper) list.removeFirst(); m_usedUsedConnection.add(wrapper); m_notUsedConnection.addAll(list); list.clear(); return wrapper.connection; } private static ConnectionWrapper getNewConnection() { try { Connection con = DriverManager.getConnection(m_url, m_user, m_password); ConnectionWrapper wrapper = new ConnectionWrapper(con); return wrapper; } catch (Exception e) { e.printStackTrace(); } return null; } static synchronized void pushConnectionBackToPool(ConnectionWrapper con) { boolean exist = m_usedUsedConnection.remove(con); if (exist) { m_notUsedConnection.addLast(con); } } public static int close() { int count = 0; if(DEBUG){ System.out.println("it is DBConnection's close()"); } Iterator iterator = m_notUsedConnection.iterator(); while (iterator.hasNext()) { try { ( (ConnectionWrapper) iterator.next()).close(); count++; } catch (Exception e) { } } m_notUsedConnection.clear(); iterator = m_usedUsedConnection.iterator(); while (iterator.hasNext()) { try { ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next(); wrapper.close(); if (DEBUG) { wrapper.debugInfo.printStackTrace(); } count++; } catch (Exception e) { } } m_usedUsedConnection.clear(); return count; } private static void clearClosedConnection() { long time = System.currentTimeMillis(); //sometimes user change system time,just return if (time < m_lastClearClosedConnection) { time = m_lastClearClosedConnection; return; } //no need check very often if (time - m_lastClearClosedConnection < CHECK_CLOSED_CONNECTION_TIME) { return; } m_lastClearClosedConnection = time; //begin check Iterator iterator = m_notUsedConnection.iterator(); while (iterator.hasNext()) { ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next(); try { if (wrapper.connection.isClosed()) { iterator.remove(); } } catch (Exception e) { iterator.remove(); if (DEBUG) { System.out.println( "connection is closed, this connection initial StackTrace"); wrapper.debugInfo.printStackTrace(); } } } //make connection pool size smaller if too big int decrease = getDecreasingConnectionCount(); if (m_notUsedConnection.size() < decrease) { return; } while (decrease-- > 0) { ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection. removeFirst(); try { wrapper.connection.close(); } catch (Exception e) { } } } /** * get increasing connection count, not just add 1 connection * @return count */ public static int getIncreasingConnectionCount() { int count = 1; int current = getConnectionCount(); count = current / 4; if (count < 1) { count = 1; } return count; } /** * get decreasing connection count, not just remove 1 connection * @return count */ public static int getDecreasingConnectionCount() { int count = 0; int current = getConnectionCount(); if (current < 10) { return 0; } return current / 3; } public synchronized static void printDebugMsg() { printDebugMsg(System.out); } public synchronized static void printDebugMsg(PrintStream out) { if (DEBUG == false) { return; } StringBuffer msg = new StringBuffer(); msg.append("debug message in " + DBConnectionPool.class.getName()); msg.append("\r\n"); msg.append("total count is connection pool: " + getConnectionCount()); msg.append("\r\n"); msg.append("not used connection count: " + getNotUsedConnectionCount()); msg.append("\r\n"); msg.append("used connection, count: " + getUsedConnectionCount()); out.println(msg); Iterator iterator = m_usedUsedConnection.iterator(); while (iterator.hasNext()) { ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next(); wrapper.debugInfo.printStackTrace(out); } out.println(); } public static synchronized int getNotUsedConnectionCount() { return m_notUsedConnection.size(); } public static synchronized int getUsedConnectionCount() { return m_usedUsedConnection.size(); } public static synchronized int getConnectionCount() { return m_notUsedConnection.size() + m_usedUsedConnection.size(); } public static String getUrl() { return m_url; } public static void setUrl(String url) { if (url == null) { return; } m_url = url.trim(); } public static String getUser() { return m_user; } public static void setUser(String user) { if (user == null) { return; } m_user = user.trim(); } public static String getPassword() { return m_password; } public static void setPassword(String password) { if (password == null) { return; } m_password = password.trim(); } } class ConnectionWrapper implements InvocationHandler { private final static String CLOSE_METHOD_NAME = "close"; public Connection connection = null; private Connection m_originConnection = null; static final boolean DEBUG = true; public long lastAccessTime = System.currentTimeMillis(); Throwable debugInfo = new Throwable("Connection initial statement"); ConnectionWrapper(Connection con) { Class[] interfaces = { java.sql.Connection.class}; this.connection = (Connection) Proxy.newProxyInstance( con.getClass().getClassLoader(), interfaces, this); m_originConnection = con; } void close() throws SQLException { if(DEBUG){ System.out.println("it is close method"); } m_originConnection.close(); } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; if (CLOSE_METHOD_NAME.equals(m.getName())) { DBConnectionPool.pushConnectionBackToPool(this); } else { obj = m.invoke(m_originConnection, args); } if (DEBUG) { System.out.println(m.getName()+"is invoke!"); } lastAccessTime = System.currentTimeMillis(); return obj; } public static void main(String[] args) { DBConnectionPool.setUrl( "jdbc:microsoft:sqlserver://192.168.0.76:1433;DatabaseName=sms_misc"); DBConnectionPool.setUser("lhf"); DBConnectionPool.setPassword("lhf"); Connection con = DBConnectionPool.getConnection(); Connection con1 = DBConnectionPool.getConnection(); Connection con2 = DBConnectionPool.getConnection(); //do something with con ... try { Statement stmt1 = con.createStatement(); Statement stmt2 = con1.createStatement(); Statement stmt3 = con2.createStatement(); for (int i = 0; i < 10; i++) { // stmt1.executeUpdate("exec testyh"); // stmt2.executeUpdate("update yhgatemt_v3 set yh_status='wait'"); // stmt3.executeUpdate("update yhgatemt_v3 set yh_status='past'"); } } catch (Exception e) { System.out.println("error"); } try { System.out.println("Closing con"); con.close(); } catch (Exception e) {} try { System.out.println("Closing con1"); con1.close(); } catch (Exception e) {} try { System.out.println("Closing con2"); con2.close(); } catch (Exception e) {} con = DBConnectionPool.getConnection(); con1 = DBConnectionPool.getConnection(); try { con1.close(); } catch (Exception e) {} con2 = DBConnectionPool.getConnection(); DBConnectionPool.printDebugMsg(); } }
发表评论
-
Phantomjs/Casperjs, HtmlUnit, Selenium在获取Javascript页面时特性对比
2015-11-28 13:53 2442Phantomjs/Casperjs, HtmlUnit, ... -
xml + xslt => html => pdf
2014-03-05 18:02 1817继上一篇:使用java将xml格式化,本blog主 ... -
使用java将xml格式化
2013-12-25 18:04 2136将生成的xml用ie浏览器打开,就可以见到漂亮的缩进的xm ... -
解决mysql中的OperationalError: (2006, 'MySQL server has gone away')
2012-08-03 16:03 7001这两天在python中用MySQLdb module操作 ... -
不能查看别人创建的存储过程的DDL
2012-08-01 14:33 1386无论用navicat还是命令行show create pro ... -
Oracle存储过程(或函数)返回游标、动态数组与java调用
2010-01-17 11:32 71071:如何从 PL/SQL 存储函数返回数组 在数据库中创 ... -
Flash视频 Step by Step
2010-01-05 16:45 1929编写播放器 固定视频的宽度和高度(400 X 300) ... -
捕获用户按键"Ctrl+C"
2009-12-24 17:45 3445在Console下,用户按下Ctrl+C后,进程就会收到相 ... -
一段代码演示http客户端缓存的几个参数
2009-12-10 20:25 1159以前的代码片段: /** * * * 实现获取 ... -
你最关注java的什么?
2009-12-04 17:25 1275原文参考: http://java.dzone.com/new ... -
两集合求交集的算法比较
2009-11-24 17:50 6220常常看javaeye的问答频道,想从已有答案的问题中找一些灵感 ... -
隐藏/显示 Table Row(s)
2009-10-09 15:13 1584第一行 第二行 第三行 现在要动态 show/hide ... -
当正则表达式碰上"$" 或"\"
2009-10-08 13:00 1160在java中使用到正则表达式,比如String.replace ... -
PHPExcel使用总结
2009-10-07 13:07 7897使用开源 PHPExcel 有些时间了。 下面 ... -
Html Email AD
2009-09-28 12:31 1847下面是用php 发送html Em ... -
你需要登录后才能操作?
2009-09-25 11:51 1788进入一个网站,你看到很多心动的东西, 你想进一步操作。 UI提 ...
相关推荐
本文将详细解析Hook的概念、工作原理,以及如何通过动态生成DLL实现DLL注入,结合"Hook演示"的实例进行深入探讨。 1. Hook概念: Hook是一种编程技术,它允许开发者在特定的函数或事件被调用前或调用后插入自定义...
本文将详细介绍API Hook的基本原理及其实现方法。 #### 二、Hook的概念 在Windows系统中,消息(message)的传递机制是核心组件之一。消息可以视为一系列具有特定含义的数值标识,类似于通信中的信号代码。Windows...
在Windows环境中,有多种方法来实现API Hook,其中一种是使用结构化异常处理(Structured Exception Handling, 简称SEH)。本篇文章将深入探讨如何利用SEH技术来实现API Hook。 首先,我们需要理解SEH的基本概念。...
【标题】"VEH+硬件断点实现无痕HOOK"涉及的是Windows系统中的一种高级调试技术,主要用于在不改变目标程序原始行为的情况下,插入自定义代码以监控或修改其执行流程。这种技术常用于软件调试、逆向工程、安全检测等...
3. **设置钩子**:在代理类中,你需要使用`EasyHook.LocalHook.Create`方法创建本地钩子,指定要拦截的函数地址和回调方法。对于远程进程,使用`EasyHook.RemoteHooking.CreateAndInject`方法。 4. **启动服务**:...
通过注解标记切点,再利用反射和动态代理在运行时生成代理对象,实现方法拦截,从而实现事务管理、日志记录等功能。此外,注解还可以用于配置管理,简化XML配置,提高代码可读性和维护性。 总之,反射、动态代理和...
4. **设置Hook**:使用ReplaceFunction或者VTableHook等方法,将目标函数的地址替换为我们自己的Hook函数地址。如果是全局函数,可以使用Detour或者MinHook库;如果是类成员函数,可能需要使用VTable Hook。 5. **...
总之,EasyHook是实现远程进程API Hook的强大工具,通过理解其工作原理和使用方法,我们可以有效地监控和控制远程进程的行为,从而实现各种复杂的功能。但需要注意,不恰当的使用可能会导致安全问题,因此在实际应用...
本文将深入探讨C#和C++中Hook的实现方式,以及DLL的打包与使用,这对于理解系统底层运作和进行软件调试、监控等任务极其有用。 首先,我们来看C#中的Hook技术。在.NET环境中,C#通过System.Threading.Thread类的...
内核三步走实现Inline Hook是一种在操作系统内核层面对函数进行动态拦截和修改的技术,常用于系统调试、性能分析以及安全监控等场景。本文将详细介绍如何通过三个关键步骤实现内核级的Inline Hook。 首先,理解...
本文讲述一下Linux下的Net的Hook,使用net的Hook可以实现很多很多非常底层的功能,比如过滤报文,做防火墙,做代理等等。我们知道Windows下面也有Hook的功能,但是要Hook到Net的底层,一般是使用NDIS来实现,但是...
Hook编程是一种在软件开发中广泛使用的技术,尤其是在Windows API、Android和React Native等环境中。它允许开发者拦截并修改系统函数调用或者特定程序的行为,从而实现功能扩展、调试、日志记录等多种目的。本篇文章...
发布一个自己写的用于Hook .Net方法的类库,代码量不大,完全的C#代码实现,是一个比较有趣的功能,分享出来希望能和大家共同探讨 安装:Install-Package DotNetDetour 源码:...
总结来说,"hookDemo.zip"中的内容很可能是关于如何在Android环境中,利用反射和动态代理技术进行方法拦截和控制的一个实战案例。通过深入学习和理解这部分内容,开发者可以更加灵活地操控程序行为,提升代码的扩展...
为了实现键盘监控功能,首先需要创建一个动态链接库(DLL),并在其中定义Hook的处理函数。这里提供了一个简单的示例代码: ```pascal library keyspy; uses windows, messages, hookproc in 'hookproc.pas'; ...
本示例将详细介绍如何使用C#语言实现对系统API `IsDebuggerPresent` 的hook,以及在管理员权限下运行这一过程。 `IsDebuggerPresent` 是一个Windows API函数,它的主要作用是检查当前进程是否被调试器挂接。如果...
在Windows操作系统中,通常使用API Hook,通过替换目标函数的地址来实现。C++虽然没有内置的Hook机制,但我们可以利用C++的灵活性和底层特性来实现类似的功能。 1. **API Hook**:这是最常见的Hook方式,通过替换...
实现Hook API的方法主要有两种:全局Hook和本地Hook。全局Hook影响整个系统,适用于监控所有进程;本地Hook仅影响当前进程,更安全,但范围有限。常见的Hook技术包括函数指针替换、VTable Hook(针对面向对象编程)...
API Hook是一种技术,用于在应用程序调用特定API(应用程序接口)时插入自定义代码或监视API的使用。在VC++(Visual C++)环境中,我们可以使用API Hook来拦截系统函数调用,以便在调用前后执行自定义逻辑,或者替换...
在Delphi编程环境下,通过使用HOOK技术,开发者可以深入理解和控制程序运行过程,实现如键盘、鼠标事件的监听,以及文件I/O等操作的监控。下面我们将详细探讨Delphi中实现的各种HOOK钩子以及它们的应用实例。 1. **...