关于java的代理 有两种:静态代理和动态代理;所谓代理好处我的理解就是代理的目标对象的同时,做些其他的事情譬如事物的安全性检测 ;下面举个例子
写道
//定义一个接口
package com.spring.static_proxy;
/**
*
* @author CHENLEI
*
*/
public interface usermanager {
public void delet(int id);
public void add(String username);
}
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(){}
}
/**
* 静态代理
*
* @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");
}
}
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");
}
}
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);
}
}
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的动态代理需要实现一个 接口才可以生产代理对象