关于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的动态代理需要实现一个 接口才可以生产代理对象
分享到:
相关推荐
自己总结的代理模式和Java中的动态代理模式,有源码
HTTP代理服务器java 简单网站过滤
Java代理服务器的实现Java代理服务器的实现
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
基于Java实现的代理服务器,实现socks4,socks5协议
JAVA静态代理和动态代理
lotus domnio java代理输出html代理
java操作IE代理代码和工具,吧dll文件放到jdk/bin目录下
java代理机制 JDK动态代理和cglib代理 详解
java代理模式
Java写http代理服务器
Java代理模式 事例很生动,非常容易理解,推荐给大家。
java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。
lotus domnio java代理传值
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版 java动态代理 完整版
lotus domino java代理_获取传递值json
一个比较完善的Java代理服务器程序,里面代码其全,结构清晰,值得研究。
1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...