Java 动态代理

自定义静态代理:相对于动态代理不灵活。
反射动态代理: 相比较静态代理要灵活,自己实现反射

JDK动态代理:基于反射实现,目标对象必须要有接口。生成的代理类是接口的一个实现类。
CGLib动态代理:CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高,比JDK动态代理效率稍低(与JDK版本有关),但目标对象不需要有接口。生成的代理类是目标类的子类,因此目标类不能是final的。CGLib动态代理

1 静态代理

自定义静态代理:接口类

public interface Hello {
	public String hello(String hello);
}

静态代理:接口实现类

package com.xu.statics.proxy;

public class HelloImpl implements Hello {

	@Override
	public String say(String str) {
		return "静态代理:" + str;
	}

}

静态代理:代理类

package com.xu.statics.proxy;

/**
 * 静态代理
 * @author hyacinth
 *
 */
public class StaticProxy implements Hello{

	private Hello hello = new HelloImpl();
	
	@Override
	public String say(String str) {
		return hello.say(str);
	}

}

静态代理:测试类

package com.xu.statics.proxy;

/**
 * 测试类
 * @author hyacinth
 *
 */
public class Test {
	
	public static void main(String[] args) {
		StaticProxy proxy = new StaticProxy();
		System.out.println(proxy.say("111111"));		;		
	}
	
}

在这里插入图片描述

2 JDK动态代理

JDK动态代理:接口类

package com.xu.jdk.proxy;

interface Hello {
	String say(String str);
}

JDK动态代理:接口实现类

package com.xu.jdk.proxy;

public class HelloImpl implements Hello {

	@Override
	public String say(String str) {
		// TODO Auto-generated method stub
		return "JDK代理:" + str;
	}

}

JDK动态代理:代理类

package com.xu.jdk.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * JDK 原生动态代理
 * @author hyacinth
 *
 */
public class DycProxy implements InvocationHandler {

	private Hello hello;
	
	public DycProxy(Hello hello) {
		this.hello = hello;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if (method.getName().equalsIgnoreCase("say")) {
			System.out.println("DycProxy:" + Arrays.toString(args));
		}
		return method.invoke(hello, args);
	}

}

JDK动态代理:测试类

package com.xu.jdk.proxy;

import java.lang.reflect.Proxy;

/**
 * 测试类
 * @author hyacinth
 *
 */
public class Test {

	public static void main(String[] args) {
		Hello hello = (Hello) Proxy.newProxyInstance(
				Hello.class.getClassLoader(), 
				new Class<?>[] {Hello.class}, 
				new DycProxy(new HelloImpl()));
		System.out.println(hello.say("111111"));
	}

}

在这里插入图片描述

3 CGLIB动态代理

CGLIB动态代理:被代理类

package com.xu.cglib.proxy;

public class Hello {
	
	public String say(String str){
		return "CGLIB代理:" + str;
	}
	
}

CGLIB动态代理:CGLIB动态代理处理类

public class ProxyHander implements InvocationHandler {

	private Object target;
	
	public Object createProxyObject(Object target) {
		this.target=target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return method.invoke(target, args);
	}

}

CGLIB动态代理:测试类

package com.xu.cglib.proxy;

import net.sf.cglib.proxy.Enhancer;

public class Test {

	public static void main(String[] args) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(Hello.class);
		enhancer.setCallback(new DycProxy());

		Hello hello = (Hello)enhancer.create();
		System.out.println(hello.say("111111"));
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值