`

JDK Proxy使用

 
阅读更多

1: 使用JDK Proxy 进行动态拦截某个类的方法执行, 此类必须实现某个接口.

 

2:例子如下:

package com.toon.mybatis.dao.monitor;

import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

import javax.sql.DataSource;

import com.jamonapi.proxy.MonProxyFactory;

//import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

public class MonitorDataSource implements DataSource {

	private static final String interceptMethodName = "getConnection";

	private DataSource targetDataSource;

	public void setTargetDataSource(DataSource targetDataSource) {
		this.targetDataSource = targetDataSource;
	}

	private DataSource proxyDataSource;

	public MonitorDataSource() {
		this.proxyDataSource = (DataSource) Proxy.newProxyInstance(MonitorDataSource.class.getClassLoader(), new Class[] { DataSource.class }, new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object retVal = method.invoke(targetDataSource, args); // 执行目标方法且得到返回值
				if (interceptMethodName.equals(method.getName())) {
					return MonProxyFactory.monitor((Connection) retVal);
				}
				return retVal;
			}
		});
	}

	// 以下是被代理的方法

	@Override
	public <T> T unwrap(Class<T> iface) throws SQLException {
		return proxyDataSource.unwrap(iface);
	}

	@Override
	public boolean isWrapperFor(Class<?> iface) throws SQLException {
		return proxyDataSource.isWrapperFor(iface);
	}

	@Override
	public PrintWriter getLogWriter() throws SQLException {
		return proxyDataSource.getLogWriter();
	}

	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {
		proxyDataSource.setLogWriter(out);
	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {
		proxyDataSource.setLoginTimeout(seconds);
	}

	@Override
	public int getLoginTimeout() throws SQLException {
		return proxyDataSource.getLoginTimeout();
	}

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		return proxyDataSource.getParentLogger();
	}

	@Override
	public Connection getConnection() throws SQLException {
		return proxyDataSource.getConnection();
	}

	@Override
	public Connection getConnection(String username, String password) throws SQLException {
		return proxyDataSource.getConnection(username, password);
	}

}

 

分享到:
评论

相关推荐

    JdkProxy.java

    JdkProxy.java

    Aop jdk proxy实现小例子

    下面我们将详细讲解如何使用JDK Proxy实现Aop。 首先,我们需要定义一个接口,这个接口将代表我们要进行代理的目标对象的行为。例如,我们可以创建一个名为`Service`的接口: ```java public interface Service { ...

    Spring_0300_JDKProxy

    标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...

    mybatis_jdk_proxy.zip

    针对标题"mybatis_jdk_proxy.zip",我们可以推断这是一个关于MyBatis框架使用Java JDK代理(JDK Proxy)的相关学习资料。下面将详细解释这个主题。 MyBatis是一个流行的持久层框架,它允许开发者通过简单的XML或...

    静态代理 动态代理 jdk Proxy

    自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { ...

    JDK动态代理proxy

    JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...

    2023版Java面试题.pdf

    :JDK Proxy 使用 Java 反射机制,而 CGLib 使用字节码生成技术。 4. 什么是深克隆和浅克隆?:深克隆是完全复制对象,而浅克隆是只复制对象的引用。 5. 如何实现深克隆?:可以使用对象的 clone() 方法或序列化机制...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    在Spring AOP中,如果目标对象实现了至少一个接口,那么Spring会选择使用JDK Proxy。以下是一个简单的示例: ```java public interface MyService { void doSomething(); } public class MyServiceImpl ...

    AOP__使用JDK中的Proxy技术实现AOP功能

    在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...

    AOP_1.入门及使用JDK中的Proxy技术实现实例

    在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...

    JDK-proxy-mode-spring-source-code-.zip_spring code

    JDK代理适用于目标对象实现了接口的情况,而CGLIB代理则是在目标对象没有接口或者接口数量过多时使用,它通过字节码技术创建一个目标对象的子类来实现代理。 在Spring的源码中,`org.springframework.aop.framework...

    JDK1.6使用BouncyCastle第三方jar支持TSL1.2通过Nginx转发多个HTTPS接口请求

    使用Nginx作为代理服务器,HTTP的接口代理没有问题,HTPPS的接口代理Java后台总是报错,主要是因为项目使用的JDK1.6,不支持TLS1.2导致握手失败。通过BouncyCastle的第三方jar包可以解决这个问题。也可以使用Nginx的...

    JDKProxy:用来理解jdk基于接口的动态代理和cglib基于类代理区别的demo

    本示例"JDKProxy"着重于对比两种常见的动态代理技术:JDK的接口代理和CGLIB的类代理。这两种代理方式在Java应用程序中都有广泛的应用,例如在AOP(面向切面编程)框架如Spring中。 首先,我们来深入了解一下JDK的...

    jdk6免安装下载 免费下载

    4. **动态代理增强**:通过java.lang.reflect.Proxy类,JDK6支持接口方法的默认实现,使得动态代理更加灵活。 5. **脚本语言支持**:JDK6通过JSR 223引入了对JavaScript和其他脚本语言的支持,使得Java平台可以嵌入...

    JDK1.6.0_13免安装版

    4. **动态代理**:在JDK 1.6中,Java引入了Java.lang.reflect.Proxy类,允许创建动态代理对象,这对于实现AOP(面向切面编程)等设计模式非常有用。 5. **NIO.2**:Java NIO (Non-blocking Input/Output) 在1.6版本...

    jdk1.6.0_45

    - **动态代理类**:在Java 1.6中,可以使用`java.lang.reflect.Proxy`类创建动态代理类,用于实现接口的动态方法调用。 - **改进的内存管理**:垃圾回收器进行了优化,提高了内存管理效率,降低了应用暂停时间。 ...

    JDK动态代理_JDK动态代理

    3. **创建动态代理对象**:使用`Proxy.newProxyInstance`方法创建动态代理对象,传入ClassLoader、接口数组和上一步骤创建的InvocationHandler实例。 4. **调用代理对象的方法**:当调用代理对象的方法时,会自动...

    java-jdk1.6-jdk-6u45-windows-x64.zip

    "使用说明.txt"文件可能包含关于如何配置环境变量、启动Java应用程序或使用特定工具的详细步骤。务必仔细阅读并按照说明进行操作,以确保Java开发环境的正确配置。 总的来说,Java JDK 1.6对于当时的开发者来说是一...

    jdk动态代理技术详解

    Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...

    关于jdk动态代理的源码剖析

    - **只能代理实现了接口的类**:这是JDK动态代理的一个限制,如果目标对象没有实现任何接口,则无法使用JDK动态代理。 - **性能开销**:虽然这种开销通常很小,但在高并发场景下可能会成为瓶颈。 通过上述分析,...

Global site tag (gtag.js) - Google Analytics