一. jdk动态代理
1. 接口
public interface People {
String createPeopleName(String name);
}
2. 实现类
public class Student implements People
{
@Override
public String createPeopleName(String name) {
System.out.println("测试jdk动态代理名称为" + name);
return "JDK" + name;
}
}
public class Teacher implements People {
@Override
public String createPeopleName(String name) {
System.out.println("这是老师代理");
return "老师 " + name;
}
}
3. 代理类
public class ProxyFactory<T> {
private final Class<T> classes;
public ProxyFactory(Class<T> classes){
this.classes = classes;
}
@SuppressWarnings("unchecked")
public T getInstance(){
return (T)Proxy.newProxyInstance(classes.getClassLoader(), classes.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk动态代理增强");
return method.invoke(classes.newInstance(), args);
}
});
}
@SuppressWarnings("unchecked")
public static <T> T proxyObject(Class<T> parentClass, Class<? extends T> sonClass)
{
return (T) Proxy.newProxyInstance(sonClass.getClassLoader(), new Class[]{parentClass}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(sonClass.getSimpleName());
if(sonClass.getSimpleName().equals(Student.class.getSimpleName())){
Object[] sz = new Object[args.length];
int index = 0;
for (Object arg : args) {
System.out.println(arg.toString());
sz[index] = arg.toString() + "哈哈";
}
return method.invoke(sonClass.newInstance(), sz);
}else{
return method.invoke(sonClass.newInstance(), args);
}
}
});
}
}
4. 测试类
public class Client {
public static void main(String[] args) throws Exception{
ProxyFactory proxyFactory = new ProxyFactory(Student.class);
People instance = (People)proxyFactory.getInstance();
System.out.println(instance.createPeopleName("张jdk"));
System.out.println("--------------------------------");
ProxyFactory proxyFactoryx = new ProxyFactory(Teacher.class);
People instancex = (People)proxyFactoryx.getInstance();
System.out.println(instancex.createPeopleName("李jdk"));
People student = ProxyFactory.proxyObject(People.class, Student.class);
System.out.println(student.createPeopleName("李"));
System.out.println("--------------------------------");
People teacher = ProxyFactory.proxyObject(People.class, Teacher.class);
System.out.println(teacher.createPeopleName("王"));
}
}
2. cglib动态代理
1. 依赖
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
2. 代理对象类
public class Student {
public String createPeopleName(String name) {
System.out.println("测试jdk动态代理名称为" + name);
return "JDK" + name;
}
}
3. 代理类
public class ProxyFactory implements MethodInterceptor {
private Object obj;
public ProxyFactory(Object obj){
this.obj = obj;
}
public Object getProxyObj(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.obj.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib执行");
return methodProxy.invoke(obj, objects);
}
}
4. 测试类
public class Client {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory(new Student());
Student instance = (Student)proxyFactory.getProxyObj();
System.out.println(instance.createPeopleName("李cglib"));
}
}