java动态代理的两种demo

1,078 阅读1分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

1.代理的作用

代理最直接的方式就是静态代理在原有方法上添加操作,耦合和代码量比较多。

在不改变原有代码逻辑的时候增加一些其他功能。
例如在原有的代码功能基础上做一些二开的操作,或者运行时间统计,日志,事务控制等。

下面用个简单的例子实现下动态代理的效果

2.jdk自带的

注意自带需要有个实现的接口

2.1接口定义

public interface PersonEATInterface {
    public void eat();
}

2.2实现类

public class PersonEAT implements PersonEATInterface {
	public void eat() {
         System.out.println("吃饭");		
	}
}

2.3代理实现

public class PersonEatHandler implements InvocationHandler {

	 private Object target = null;
	 
	 PersonEatHandler(Object target){
	  this.target = target;
	 }
	 
	 public Object invoke(Object proxy, Method method, Object[] args)
	   throws Throwable { 
	   System.out.println("饭前洗洗手");
	   Object result = method.invoke(target, args);
	   System.out.println("饭后散散步");
	   return result;
	 }
}

2.4测试

public class PersonEATTest {
public static void main(String[] args) {
PersonEAT eat = new PersonEAT();
eat.eat();

PersonEatHandler handler = new PersonEatHandler(eat);
PersonEATInterface bp = (PersonEATInterface)Proxy.newProxyInstance(eat.getClass().getClassLoader(), eat.getClass().getInterfaces(), handler);
bp.eat();
}
}

2.5效果

吃饭
饭前洗洗手
吃饭
饭后散散步

3.通过cglib的实现方式

不需要定义接口

<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>3.3.0</version>
</dependency>

3.1代理类实现

public class PersonProxy implements MethodInterceptor {

public Object intercept(Object obj, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
		Object result;
		System.out.println("饭前洗洗手");
		result=proxy.invokeSuper(obj, objects);
		System.out.println("饭后散散步");
		return result;
	}
}

3.2测试

public class PersonProxyTest {
	public static void main(String[] args) throws SQLException {
		PersonProxy daoProxy = new PersonProxy();
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(PersonEAT.class);
		enhancer.setCallback(daoProxy);
		PersonEAT dt=(PersonEAT)enhancer.create();
		dt.eat();
	}
}

3.3效果

饭前洗洗手
吃饭
饭后散散步