反射与动态代理

0.正向代理与反向代理
正向代理:用户A通过代理B访问资源C,不能直接访问C。用户A在客户端需要做代理设置。
反向代理:用户A直接访问代理B,B去访问了资源C,并将资源C返回给资源A,从而A获得了资源C。这里B对用户A就是一个服务器一样,它去访问用户A想要的资源并将结果返回给A,A不知道B访问C,就像是B给他的一样。(借钱例子)
参考:http://bbs.51cto.com/thread-967852-1-1.html
1. Java反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,
都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
class类:JVM纪录了每个对象所属的类,用来保存这些类型信息的类是Class类
方法的反射:method.invoke(obj, args);
小demo:
Class cls = Class.forName("BBB"); // 通过Class获得所对应对象的方法
Object o=cls.newInstance();
Field[] feilds=cls.getDeclaredFields();
Method[] methods = cls.getDeclaredMethods(); // 输出每个方法名
for (Method method : methods) {
if(method.getName().equals("ss"))
method.invoke(o, 456,"woqu");
}
2.什么是动态代理?
答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
3.为什么使用动态代理?
答:因为动态代理可以对请求进行任何处理
应用:切面编程aop,权限控制,日志记录等等。

4. 动态代理demo:
参考:http://www.cnblogs.com/linjiqin/archive/2011/02/18/1957600.html

4.1 核心代理类:
public class HelloWorldHandler implements InvocationHandler{
//要代理的原始对象
private Object obj;
public HelloWorldHandler(Object obj) {
super();
this.obj = obj;
}

/**
* 在代理实例上处理方法调用并返回结果
*
* @param proxy 代理类
* @param method 被代理的方法
* @param args 该方法的参数数组
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//调用之前
doBefore();
//调用原始对象的方法
result=method.invoke(obj, args);
//调用之后
doAfter();
return result;
}
private void doBefore(){
System.out.println("before method invoke");
}
private void doAfter(){
System.out.println("after method invoke");
}

//也可以将下面代码放入,使用时调用.getProxy()即可。
1. public Object getProxy() {
2. return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
3. target.getClass().getInterfaces(), this);
4. }
4.2 代理类的使用:
HelloWorld helloWorld=new HelloWorldImpl();
InvocationHandler handler=new HelloWorldHandler(helloWorld);
//创建动态代理对象
HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值