`
季铵盐
  • 浏览: 57294 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

关于java的代理问题

阅读更多

关于java的代理 有两种:静态代理和动态代理;所谓代理好处我的理解就是代理的目标对象的同时,做些其他的事情譬如事物的安全性检测 ;下面举个例子

 写道
//定义一个接口
package com.spring.static_proxy;
/**
*
* @author CHENLEI
*
*/
public interface usermanager {
public void delet(int id);
public void add(String username);
}
 
写道
// 实现定义的接口 public class usermanagerImp implements usermanager { @Override public void delet(int id) { System.out.println("delet invoked"); } @Override public void add(String username) { System.out.println("add invoked"); } }
 

 

 

 

 

 写道
//创建一个代理类实现usermanager接口
/**
* 静态代理
*
* @author CHENLEI
*
*/
public class usermanagerProxy implements usermanager{

private usermanager usermanager;//要代理的对象
public usermanagerProxy(usermanager usermanager){
this.usermanager=usermanager;
}
@Override
public void delet(int id) {
checked();
}


public void add(String username) {
checked();//横切性问题,独立的事物,和add()互不影响-----横切性的关注点
this.usermanager.add("okok");
}
//安全检查(代理类干的其他事情)
private void checked(){}

}
   

 

   ok 这里静态的代理就 做好了 

   测试

 

 写道
写道
package com.spring.static_proxy;

import com.spring.Proxy.handler;

public class testproxy {

public static void main(String[]args){
usermanager user=new usermanagerImp();
usermanagerProxy userproxy=new usermanagerProxy(user);
userproxy.add("okok");

}

}
 
 

 

下面是动态代理,这个东西我比较喜欢,灵活,不需要为每一个类编写代理类,只要一个就ok

首先我们要实现一个接口InvocationHandler,通过一个方法返回一个要代理object对象,同时我们要重写invoke()方法

 Proxy.newProxyInstance()方法的参数,依次是代理类的classloader,代理类所实现的接口,这里就是我们的usermanaher接口,最后一个是我们代理的实例对象

method就是我们代理目标对象的方法

 

 
package com.spring.Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理demo
* @author CHENLEI
*/
public class handler implements InvocationHandler {

private Object targetobject;//代理的目标对象
public Object newPorxy(Object targetobject){//动态的返回要代理的目标对象
this.targetobject=targetobject;
return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),
targetobject.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

if(method.getName().equalsIgnoreCase("add")){
checked(method);//安全检查
return method.invoke(targetobject,args);//method代理目标对象所要调用的方法和 args 参数
}else{
return method.invoke(targetobject,args);//method代理对象所要调用的方法
}

}
private void checked(Method method) {
System.out.println(method.getName()+" checked invoked");

}

}
 

 

 

 测试动态代理
package com.spring.static_proxy;

import com.spring.Proxy.handler;

public class testproxy {

public static void main(String[]args){
// usermanager user=new usermanagerImp();
//
// usermanagerProxy userproxy=new usermanagerProxy(user);
// userproxy.add("okok");
  handler hand=new handler();
 usermanager user=(usermanager) hand.newPorxy(new usermanagerImp());//动态的返回目标对象
  user.add("okok");user.delet(1);
}

}
 

 

 ok 在这里大概的代理就搞定了。

jdk的动态代理需要实现一个 接口才可以生产代理对象

 

 

 

 

 

 

 

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics