黑马程序员 java基础之动态代理
2013-05-14 17:38
549 查看
动态代理
要为已存在的多个具有相同接口的目标类的各个方法增加一个系统功能,例如日志,异常处理,计算方法运行时间等。
这个时候就需要创建一个代理类,这个类和目标类有相同的方法 ,只是在每个方法之前或者之后增加了一些特有代码。
在java中提供了一个类Proxy
Proxy:该类即为动态代理类,代理类和目标类要实现相同的接口,而且要有目标类相同的方法。
创建代理的方法:
例如:创建一个实现了Foo接口的代理类
方法一:
Class proxyclazz=Proxy.getProxyClass(Foo.class.getClassLoader,Foo.class);
Constructor constructor=proxyclazz.getConstructor(InvocationHandler hander);
Foo proxy1=(Foo)constructor.newInstance(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});
方法二:
Proxy proxy2=(Foo)Proxy.newProxyInstance(
Foo.class.getClassLoader,
Foo.class,
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
}
)
写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
package com.itheima;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import com.itheima.proxy.Advice;
import com.itheima.proxy.Myadvice;
/*
*
* 4、 写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
*/
public class Text4 {
public static void main(String[] args) {
final ArrayList traget=new ArrayList();
Collection proxy = (Collection)getProxy(traget,new Myadvice());
proxy.add("asdf");
proxy.add("sadf");
proxy.add("asdfasdfasdf");
}
public static Object getProxy(final Object traget,final Advice advice) {
Object proxy=Proxy.newProxyInstance(
traget.getClass().getClassLoader(),
traget.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
advice.beforeMethod(method);
Object val=method.invoke(traget, args);
advice.afterMethod(method);
return val;
}
});
return proxy;
}
}
package com.itheima.proxy;
import java.lang.reflect.Method;
public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}
package com.itheima.proxy;
import java.lang.reflect.Method;
public class Myadvice implements Advice {
long begintime=0;
@Override
public void beforeMethod(Method method) {
begintime=System.currentTimeMillis();
}
@Override
public void afterMethod(Method method) {
long endtime=System.currentTimeMillis();
System.out.println(method.getName()+"\t"+"run time is:"+(endtime-begintime));
}
}
要为已存在的多个具有相同接口的目标类的各个方法增加一个系统功能,例如日志,异常处理,计算方法运行时间等。
这个时候就需要创建一个代理类,这个类和目标类有相同的方法 ,只是在每个方法之前或者之后增加了一些特有代码。
在java中提供了一个类Proxy
Proxy:该类即为动态代理类,代理类和目标类要实现相同的接口,而且要有目标类相同的方法。
创建代理的方法:
例如:创建一个实现了Foo接口的代理类
方法一:
Class proxyclazz=Proxy.getProxyClass(Foo.class.getClassLoader,Foo.class);
Constructor constructor=proxyclazz.getConstructor(InvocationHandler hander);
Foo proxy1=(Foo)constructor.newInstance(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});
方法二:
Proxy proxy2=(Foo)Proxy.newProxyInstance(
Foo.class.getClassLoader,
Foo.class,
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
}
)
写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
package com.itheima;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import com.itheima.proxy.Advice;
import com.itheima.proxy.Myadvice;
/*
*
* 4、 写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
*/
public class Text4 {
public static void main(String[] args) {
final ArrayList traget=new ArrayList();
Collection proxy = (Collection)getProxy(traget,new Myadvice());
proxy.add("asdf");
proxy.add("sadf");
proxy.add("asdfasdfasdf");
}
public static Object getProxy(final Object traget,final Advice advice) {
Object proxy=Proxy.newProxyInstance(
traget.getClass().getClassLoader(),
traget.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
advice.beforeMethod(method);
Object val=method.invoke(traget, args);
advice.afterMethod(method);
return val;
}
});
return proxy;
}
}
package com.itheima.proxy;
import java.lang.reflect.Method;
public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}
package com.itheima.proxy;
import java.lang.reflect.Method;
public class Myadvice implements Advice {
long begintime=0;
@Override
public void beforeMethod(Method method) {
begintime=System.currentTimeMillis();
}
@Override
public void afterMethod(Method method) {
long endtime=System.currentTimeMillis();
System.out.println(method.getName()+"\t"+"run time is:"+(endtime-begintime));
}
}
相关文章推荐
- 黑马程序员--Java基础--15动态代理
- 黑马程序员--Java基础加强--08内省、类加载器、动态代理
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- 黑马程序员_Java基础_动态代理
- 黑马程序员---java基础加强---动态代理
- 黑马程序员—Java基础加强(动态代理)
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- 黑马程序员 25 Java基础加强-07-动态代理篇
- 黑马程序员-->Java基础加强-->动态代理
- 黑马程序员_Java高新技术_动态代理技术的深入理解
- Java基础之动态代理
- 黑马程序员【代理模式与Java动态代理】
- Spring AOP 之 java 动态代理基础
- Java基础:动态代理
- 黑马程序员_java基础笔记(13)...类加载器和代理
- 黑马程序员-javaBean内省 泛型 类加载器 动态代理
- 黑马程序员_java基础笔记(13)...类加载器和代理
- [ java ] java基础动态代理!
- 黑马程序员-----基础加强-动态代理
- 黑马程序员_ java高新之动态代理