您的位置:首页 > 编程语言 > Java开发

java 动态代理

2012-03-11 14:39 357 查看
package reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

// 定义一个业务接口
interface Count {
public void queryCount();

public void updateCount();
}

// 实现业物接口类
class CountImp implements Count {

@Override
public void queryCount() {

System.out.println("queryCount run...");
}

@Override
public void updateCount() {

System.out.println("updateCount run...");
}
}

// 定义代理类
class CountProxy implements Count {

private CountImp imp = null;

public CountProxy(CountImp s) {
this.imp = s;
}

@Override
public void queryCount() {

System.out.println("queryCount run before...");
imp.queryCount();
}

@Override
public void updateCount() {
System.out.println("updateCount run before...");
imp.updateCount();
}

}

/*
* 这是一个明显的静态代理,代理主要是为委托预处理消息、过滤消息,把消息转发给委托类,以
* 及事后处理消息等,代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的
* 对象相关联借类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定 的服务
*/
/*
* +++++++++++++++++++++++++++下面是一个动态代理++++++++++++++++++
*/
interface BookAdd {
public void add();
public void show();
}

class BookService implements BookAdd {

@Override
public void add() {

System.out.println("books alreay added...");
}
public void show() {}

}

class BookProxy implements InvocationHandler {
private Object target = null;// 代理的委托类

public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target
.getClass().getInterfaces(), this);// 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用
// 程序
// 该方法实际是先取得接口
} // 类加载器, // 代理的接口, 指定的调用处理程序

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable // 被代理的对象,执行对象里的方法,执行方法的参数
{ // 代理实例, 接口中的方法 参数
Object result = null;
// System.out.println(method.toString());
System.out.println(proxy.getClass());
System.out.println("事物执行的开始...");
result = method.invoke(target, args);
System.out.println("事物执行结束");
return result;
}
}

public class Agency {

public static void main(String args[]) {

dynamicProxy();
}

public static void staticProxy() {
CountImp imp = new CountImp();
CountProxy proxy = new CountProxy(imp);
proxy.queryCount();
proxy.updateCount();
}

public static void dynamicProxy() {
// 得到一个代理
BookAdd proxy = (BookAdd) new BookProxy().bind(new BookService());
proxy.add();
System.out.println(proxy.getClass());
System.out.println("proxy 属性:");
Field fields[] = proxy.getClass().getDeclaredFields();
for (Field f : fields)
System.out.println(f.getName());
System.out.println("proxy 方法:");
Method methods[] = proxy.getClass().getDeclaredMethods();
for (Method m : methods)
System.out.println(m.getName());
System.out.println("proxy 父类:"+proxy.getClass().getSuperclass());
System.out.println("proxy 接口:"+Arrays.toString(proxy.getClass().getInterfaces()));

}
}


转载:/article/5050689.html

http://paddy-w.iteye.com/blog/841798

http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: