//这里为申明公共接口,
package com.sourpuss.proxy;public interface CommInterface {
public void add(String username,String password);
public void delete(int id);
public void modifer(int id,String username,String password);
public String query(int id);
}
//下面为目标对象
package com.sourpuss.proxy;public class Targeter implements CommInterface { public void add(String username, String password) {
System.out.println("----------Targeter.add()"+username+"---"+password+"------------");
} public void delete(int id) {
System.out.println("----------Targeter.delete()------------");
} public void modifer(int id, String username, String password) {
System.out.println("----------Targeter.modifer()------------");
} public String query(int id) {
System.out.println("----------Targeter.query()------------");
return null;
}}
//下面为实现invocationHandler的类及相关方法(我的问题的在)
package com.sourpuss.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyHandler implements InvocationHandler { private Object targetobject; public Object getProxyer(Object targetobject) {
this.targetobject = targetobject;
return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),
targetobject.getClass().getInterfaces(),this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args); return result;
}
public void intercepter(){
System.out.println("this is a intercepter!");
}}//主程序
package com.sourpuss.proxy;
public class Client { public static void main(String[] args) {
DynamicProxyHandler proxyHandler=new DynamicProxyHandler();
CommInterface proxy=(CommInterface)proxyHandler.getProxyer(new Targeter());
proxy.add("sourpuss", "132");
}}
我的问题是:程序中用红色标出的部分,public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args); return result;
invoke(?,?,?)这个方法的用途,及method.invoke(?,?)是何是调用的,由谁来调用?????
希望能得到详细的程序流程,谢谢大家,虽然我没多少分,但还是拿出100分诚心求教.得到满意答案即给分.
package com.sourpuss.proxy;public interface CommInterface {
public void add(String username,String password);
public void delete(int id);
public void modifer(int id,String username,String password);
public String query(int id);
}
//下面为目标对象
package com.sourpuss.proxy;public class Targeter implements CommInterface { public void add(String username, String password) {
System.out.println("----------Targeter.add()"+username+"---"+password+"------------");
} public void delete(int id) {
System.out.println("----------Targeter.delete()------------");
} public void modifer(int id, String username, String password) {
System.out.println("----------Targeter.modifer()------------");
} public String query(int id) {
System.out.println("----------Targeter.query()------------");
return null;
}}
//下面为实现invocationHandler的类及相关方法(我的问题的在)
package com.sourpuss.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyHandler implements InvocationHandler { private Object targetobject; public Object getProxyer(Object targetobject) {
this.targetobject = targetobject;
return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),
targetobject.getClass().getInterfaces(),this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args); return result;
}
public void intercepter(){
System.out.println("this is a intercepter!");
}}//主程序
package com.sourpuss.proxy;
public class Client { public static void main(String[] args) {
DynamicProxyHandler proxyHandler=new DynamicProxyHandler();
CommInterface proxy=(CommInterface)proxyHandler.getProxyer(new Targeter());
proxy.add("sourpuss", "132");
}}
我的问题是:程序中用红色标出的部分,public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args); return result;
invoke(?,?,?)这个方法的用途,及method.invoke(?,?)是何是调用的,由谁来调用?????
希望能得到详细的程序流程,谢谢大家,虽然我没多少分,但还是拿出100分诚心求教.得到满意答案即给分.
当你得到了代理对象后,调用公共的方法时,就会来执行invoke(?,?,?),在这个方法体中有result=method.invoke(this.targetobject, args); 这个才是真正执行你实现接口的那个方法。
自己看
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
intercepter();
result=method.invoke(this.targetobject, args); return result;
}
JDK的动态代理是需要配合Proxy和InvocationHandler两个类一起使用的,代理类是有Proxy的newProxyInstance()方法产生的
产生的代理类中所有非final方法的调用都会触发绑定的InvocationHandler实例的invoke方法,即都会启动代理流程,那几个参数作用如下:1、proxy: 字面上看指代理原对象,但传进来未必是,所以用来检测本次代理中对该方法是否有访问权限
2、method: 触发代理的调用方法对象
3、args: 调用方法所需要的参数,也会和Method对象进行匹配检查
Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
第一个参数是要得到当前被代理对象的classLoader, 这个与代理的底层实现和反射有关, 可以不管他;
第二个参数得到被代理对象实现的接口; 为什么要得到它呢? 不考虑反射的知识, 那么从表面上看,newProxyInstance方法返回的对象也实现了这个接口, 所以newProxyInstance返回的对象具有目标对象一样的功能.
第三个参数: 你这里放的是this, 去看看jdk,这第三个参数应该是一个InvocationHandler接口的实现类, 那么这里的this是可以的, 因为你的当前类DynamicProxyHandler实现了InvocationHandler接口.为什么这里要放InvocationHandler的实现类? 因为我们的代理方法既然是给别人作代理, 那就应该不光是完成目标对象的工作, 还要作更多附加的工作.像你的intercepter方法就是在作这个附加的工作. 这是代理的本分, 也是我们要用代理的原因之一. 所以这里的InvocationHandler的实现类就是一个拦截器, 当你调用代理对象的方法的时候, 拦截器会截获这个调用, 然后作一些附加的工作, 再调用代理对象本身的方法.看你的invoke方法的代码:
intercepter(); //实现增强功能
result=method.invoke(this.targetobject, args); //调用目标对象的方法;
我给你一个生成代理的另外一个写法, 你看着会更容易理解一些, 其实这个方法在<spring2.0核心技术最佳实件>中讲到过.
这里面把InvocationHandler作为内部类独立出来, 看起来舒服多了.public class ProxyFactory{
public static Object createProxy(final Object target){
//return target;
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
//在这里做一些代理对象做的附加工作,比如
//intercepter();
return method.invoke(target, args);
}
}
);
}
}最后看你的测试代码:
CommInterface proxy=(CommInterface)proxyHandler.getProxyer(new Targeter());
proxy.add("sourpuss", "132");
你用的是返回的代理对象, 这个代理对象不同于你的接口, 也不同与你的接口实现类, 他是通过反射方法动态生成的一个新的object, 这个object从表面上看, 它实现了你的接口.
不知道这么说你明白否?找本书, 或者google一下, 多看几次, 就理解了.
其实说实话,项目中你会需要你这么自己去实现一个代理框架, 有太多现成的. 理解思想最重要.
项目中你不需要你这么自己去实现一个代理框架, 有太多现成的. 比如spring aop,理解思想最重要.