黑马程序员技术交流社区
标题:
反射,动态代理,类加载器
[打印本页]
作者:
朱明仁
时间:
2015-3-12 00:20
标题:
反射,动态代理,类加载器
本帖最后由 朱明仁 于 2015-3-12 00:45 编辑
通过动态代理,当然还有反射和类加载,实现在ArrayList的每个方法前面加上输出一句话
代理类实例该怎么用?程序猿们借点智慧
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.*;
class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject(Object obj) {
this.sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("Method:" + method + ",Args:" + args);//本题的目的:在每一个函数输出前面加上这句话
method.invoke(sub, args);// 调用的是sub.Request(args)输出
return null;
}
}
// 通过Proxy.newProxyInstance构建代理对象
public class Prox {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
// RealSubject realSub = new RealSubject();
ArrayList<Integer> realSub = new ArrayList<Integer>();
InvocationHandler handler = new DynamicSubject(realSub);// 实现的realSub
@SuppressWarnings("unchecked")
List<Integer> sub = (List<Integer>) Proxy.newProxyInstance(handler.getClass()
.getClassLoader(), realSub.getClass().getInterfaces(),// 传入realSub的字节码
handler);
System.out.println(sub.getClass());// 输出class $Proxy0
Integer t=new Integer(2);
sub.add(t); // 这个地方出现问题,add(Unknown Source)
//实在不知道怎么办了,如果是自己写的接口和实现就没有问题,这里用的接口是List,实现是ArrayList
Integer a=sub.get(0);
System.out.println(a);
}
}
作者:
fanshuai
时间:
2015-3-12 10:24
package cn.heima.test2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList target=new ArrayList();
Advice_1 advice=new MyAdvice_1();
List proxy=(List)getProxy(target,advice);
proxy.add(232);
}
public static Object getProxy(final ArrayList target,final Advice_1 advice){
Object proxy=Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// TODO Auto-generated method stub
advice.beforeMethod();
Object retVal=method.invoke(target, args);
return retVal;
}
});
return proxy;
}
}
class MyAdvice_1 implements Advice_1{
public void beforeMethod(){
System.out.println("方法前输出。。。。。");
}
}
interface Advice_1{
public abstract void beforeMethod();
}
作者:
朱明仁
时间:
2015-3-12 11:11
fanshuai 发表于 2015-3-12 10:24
package cn.heima.test2;
import java.lang.reflect.InvocationHandler;
谢谢大神,看懂了,虽然还不是彻底明白动态代理,但问题解决了,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2