-
智能引用代理查看全部
-
保护代理查看全部
-
虚拟代理查看全部
-
远程代理查看全部
-
代理模式的概念查看全部
-
在实际开发当中,代理模式是具有实际意义的. 比如说调用某个jar包里面类的某个方法,因为不能修改它的源码,所以可以采用代理模式这种机制,在方法前后增加一些业务逻辑. 这种方式也叫作AOP,面向切面编程.在不改变原有类的基础上,增加一些额外的业务逻辑.查看全部
-
在实际开发中,智能引用代理模式是用得最广的.查看全部
-
当字符串里面又有字符串,就需要转译才能通过,使用\符号 即String str=" 我是\"猪\" "; 此时便能通过编译. 在java中\r是回车符,\n是换行符. 在Unix系统里,每行结尾只有"换行",即"\n". Windows系统里,每行结尾是"回车+换行",即"\r\n". Mac系统里,每行结尾是"回车",即"\r". 根据系统不一样,所选择的转译字符也不一样.但功能效果都是分行. 当java程序遇到转移字符时便会解析它,完成某些功能. Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行. 而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号.查看全部
-
(使用CGLIB动态代理) //被代理类 public class Bank { public void getMoney(){ Random ran=new Random(); Float f=ran.nextFloat()*10000; System.out.println("取到了"+f+"人民币"); } } //实现MethodInterceptor的类 public class CglibProxy implements MethodInterceptor { //负责动态生成代理的类 private Enhancer enhancer=new Enhancer(); //编写并设置返回代理的方法. public Object getProxy(Class<?> obj){ //设置创建子类的类 enhancer.setSuperclass(obj); enhancer.setCallback(this); return enhancer.create(); } //该方法会在调用继承父类的方法时会拦截并执行 @Override public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { judge(); proxy.invokeSuper(obj, arg); return null; } //代理功能的业务逻辑 public void judge(){ System.out.println("--验证用户信息--"); } } //测试方法 public static void main(String[] args) { CglibProxy proxy=new CglibProxy(); Bank b=(Bank) proxy.getProxy(Bank.class); b.getMoney(); } 控制台显示: --验证用户信息-- 取到了8004.912人民币查看全部
-
使用CGLIB动态代理 (生成的代理类是继承于被代理类的) (步骤) 首先要导入一个jar包(cglib.jar) 1.创建Bank银行类,直接在类里编写getMoney()方法,不需实现接口. 2.创建一个类,返回动态代理.该类需要实现MethodInterceptor接口. 该接口声明了一个方法. public Object intercept(Object obj,Method method,Object[] args,MethodProxy proxy)方法,该方法负责拦截所有目标类方法的调用. obj参数:指目标类的实例(被代理类) method参数:目标方法的反射对象(被代理类方法的反射对象) args参数:目标方法的参数 proxy参数:代理类的实例 3.在实现MethodInterceptor接口的intercept()方法中通过proxy参数(代理类的实例)的invokeSuper(Object obj,Object args)方法来调用被代理类的方法,其中obj参数是被代理类的实例,args参数为调用被代理方法的参数.该方法的参数与intercept()方法中的参数是一样的.可以在该方法前后添加代理功能的业务逻辑. 4.创建返回代理类的方法.方法参数是被代理类的反射对象. Enhancer是一个用来返回代理类的类,有两个常用方法,setSuperClass()和setCallback(). setSuperClass(Class obj)方法用来设置创建子类的类(即为哪个类产生代理类). setCallback()方法用来设置回调. create()方法创建子类的实例,即代理对象的实例.直接返回给方法即可. public Object getProxy(Class obj){ Enhancer enhancer=new Enhancer(); enhancer.setSupperclass(obj); enhancer.setCallback(this); return enhancer.create(); } 5.在测试类中创建实现MethodInterceptor接口的实例对象.直接调用该实例对象获取代理对象的方法,并把被代理类通过参数传递进去.返回的是代理类的对象.再调用代理类继承被代理类的方法即可.查看全部
-
(JDK动态代理) //定义接口 public interface IComponent { public void getMoney(); public void pay(); } //被代理类 public class Bank implements IComponent { public void getMoney() { Random ran=new Random(); Double money=ran.nextDouble()*10000; System.out.println("取到了:"+money+"人民币"); } public void pay() { Random ran=new Random(); Double money=ran.nextDouble()*10000; System.out.println("输出:"+money+"人民币"); } } //事务处理类 public class ManageProxy implements InvocationHandler { private Object obj; public ManageProxy(Object obj){ this.obj=obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { judge(); method.invoke(obj); return null; } public void judge(){ System.out.println("验证用户信息"); } } 测试类: ManageProxy h=new ManageProxy(new Bank()); Class<?> cb=Bank.class; IComponent obj=(IComponent)Proxy.newProxyInstance(cb.getClassLoader(),cb.getInterfaces(), h); obj.getMoney(); obj.pay(); } } 控制台输出: 验证用户信息 取到了:590.6人民币 验证用户信息 输出:2095.6人民币查看全部
-
(JDK动态代理实现步骤) 1.被代理类实现一个接口,接口声明方法.实现接口的方法. 2.创建事务处理器类实现InvocationHandler接口,使用聚合方式,成员变量以Object的类型,通过构造器初始化,实现InvocationHandler接口的方法,在该方法中添加代理的功能逻辑代码. 并使用参数method的invoke(Object obj,Object param)方法,调用被代理类的方法.参数是聚合进来的成员变量对象. 3.在测试类中使用Proxy.newProxyInstance()方法动态返回一个代理对象.因为被代理对象实现一个接口,因此可以定义接口的引用来接该方法的返回值(代理对象当作被代理对象使用).需要强制类型转换.此时调用接口的方法即可.只要调用接口中的方法,jdk都会为该方法添加代理.因为在实现InvocationHandler接口的方法中,使用了method.invoke(),来调用被代理类的方法.查看全部
-
动态的产生代理有两种方式.一种是使用JDK动态代理,另一种是使用CGLIB产生动态代理. JDK动态代理 1.只能代理实现了接口的类 2.没有实现接口的类不能实现jdk的动态代理. 因为在Proxy的newProxyInstance()的静态方法中,需要传递被代理类实现了的接口的参数,因此被代理类一定要实现某些接口. CGLIB动态代理 1.针对类来实现代理的 2.对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用.因为是使用继承,所以父类不能用final修饰.查看全部
-
动态代理时,使用一个类继承InvocationHandler类,实现invoke方法,里面将为代理的内容。并私有化一个object,在构造方法中传入需要代理的对象,并赋值给该object。 当有多个代理时,一层一层嵌套。查看全部
-
聚合方式优于继承,继承会使代码冗杂,且难于维护。 聚合方式代码简洁,易于维护,且灵活性高查看全部
举报
0/150
提交
取消