接口
public interface Teacher { void teach(); void sya(String name); }实现类
public class EnglishTeacher implements Teacher { @Override public void teach() { System.out.println("上英语课"); } @Override public void sya(String name) { System.out.println("hello:"+name); } }代理类
public class ProxyClass implements Teacher{ private EnglishTeacher englishTeacher; public ProxyClass(EnglishTeacher englishTeacher){ this.englishTeacher = englishTeacher; } @Override public void teach() { englishTeacher.teach(); } @Override public void sya(String name) { englishTeacher.sya(name); } }主函数
public class Client { public static void main(String[] args) { EnglishTeacher englishTeacher = new EnglishTeacher(); ProxyClass proxyClass = new ProxyClass(englishTeacher); proxyClass.teach(); proxyClass.sya("王星宇"); } }主函数
public class Client { public static void main(String[] args) { Teacher target = new EnglishTeacher(); Teacher proxyInstance = (Teacher)new ProxyClass(target).getProxyInstance(); System.out.println(proxyInstance.getClass()); proxyInstance.teach(); proxyInstance.sya("王星宇"); } }接口
public interface Teacher { void teach(); void sya(String name); }实现类
public class EnglishTeacher implements Teacher{ @Override public void teach() { System.out.println("上英语课"); } @Override public void sya(String name) { System.out.println("hello:"+name); } }代理
public class ProxyClass{ private Object target; public ProxyClass(Object target){ this.target = target; } /** public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) //1. ClassLoader loader : 指定当前目标对象使用的类加载器, 获取加载器的方法固定 //2. Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型 //3. InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入*/ public Object getProxyInstance(){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(target, args); return invoke; } } ); } }主函数
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //创建目标对象 TeacherDao target = new TeacherDao(); //获取到代理对象,并且将目标对象传递给代理对象 TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance(); //执行代理对象的方法,触发intecept 方法,从而实现 对目标对象的调用 String res = proxyInstance.teach(); System.out.println("res=" + res); } }代理类
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class ProxyFactory implements MethodInterceptor { private Object target; public ProxyFactory(Object target) { this.target = target; } /** 返回一个代理对象: 是 target 对象的代理对象**/ public Object getProxyInstance() { //1. 创建一个工具类 Enhancer enhancer = new Enhancer(); //2. 设置父类 enhancer.setSuperclass(target.getClass()); //3. 设置回调函数 enhancer.setCallback(this); //4. 创建子类对象,即代理对象 return enhancer.create(); } /** 重写 intercept 方法,会调用目标对象的方法**/ @Override public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable { // TODO Auto-generated method stub System.out.println("Cglib代理模式 ~~ 开始"); Object returnVal = method.invoke(target, args); System.out.println("Cglib代理模式 ~~ 提交"); return returnVal; } }被代理的类
public class TeacherDao { public String teach() { System.out.println(" 老师授课中 , 我是cglib代理,不需要实现接口 "); return "hello"; } }