Java的动态代理初涉

来源:互联网 发布:k歌软件电视 编辑:程序博客网 时间:2024/04/30 22:34

      作为一个应届本科生,参加了几场校园招聘笔试面试后,深感自己的能力的不足,C++在校期间学的还可以,但还不够深入,因为希望今后从事的是Java方向的。所以像C++primer  effictive C++ 等经典的书都没看。所以c++不是很强,但在Java方面,虽然做过一些项目,面试官深问起来还是有很多东西了解的不够深入,于是决心还是一门心思好好学习吧。动态代理,之前涉猎过,蜻蜓点水,知道是那么回事,现在想想“涉猎”是我的弱点,很多东西得刨根问底。不过鉴于水平还是太菜,就先一点点的深入吧,先把动态代理搞定,再看类的加载机制,再看虚拟机,貌似spring还有一个动态生成字节码的东东,提到日程上来吧。如有过来人看到,希望能够对小菜一番指教,小菜定不胜感激。

下面是一个简单的动态代理的例子。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class DynamicProxy implements InvocationHandler,DynamicProxyInterface{

    /**
     * @param args
     */
    
    private Object obj;
    
    public DynamicProxy (Object o ){
        this.obj = o;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<String> list = ((List<String>) factor(new ArrayList<>()));
        list.add("hello ");
        list.add("world");
        
        Set set = (Set) factor(new HashSet<>());
        
        set.add("HELLO");
        set.add("WORLD");
        
        DynamicProxy real = new DynamicProxy(new Object());
        
        DynamicProxyInterface dp = (DynamicProxyInterface) factor(new DynamicProxy(new Object()));
        dp.sayHello();

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        
        System.out.println("方法调用前");
        
        Object objt = method.invoke(obj, args);
        if(null!=args)
            System.out.println(args[0]);
        System.out.println("方法调用后");
        
        return objt;
    }
    
    public void sayHello(){
        System.out.println("hello");
    }
    
    public static Object factor(Object obj)
    {
        Class<?> classType = obj.getClass();
        for(Class<?> in :classType.getInterfaces())
            System.out.println(in.getName());
        return Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), new DynamicProxy(obj));
                
    }

}


0 0
原创粉丝点击