1、反射的定义,通俗点举个例子就行。
2、项目中常用到不,如果用到,一般是解决什么问题或这需求,最好也能举个例子。
3、还有代理那一块,就是invocationhindler接口,proxy类,如何应用
4、动态代理,和静态代理异同点。小弟已经研究过了,就是感觉自己掌握的有些模糊,所以想请各位说下自己的理解。对比一下自己的理解,这样获取能够扬长避短,嘿嘿,学习学习最后谢谢回复的网友

解决方案 »

  1.   

    1、反射感觉就是从一个东西找个另一个东西
    2、a、反射能够获取一个类的实例b、JDBC获取一个connection的时候,class.forName()这个用的最多
    3、Invocationhandle接口,有一个invoke方法,方法有4个参数,研究半天理解为方法在执行时创建返回一个接口,其中第一个参数不理解,至于proxy类,里面有一个newProxyInstance(),这个方法里面的三个参数,也都能理解,类加载器,实例化接口,this只自身(这个有点不解)
    4、动态代理比静态先进,使代码耦合性降低这是我个人研究的心得,嘿嘿
      

  2.   

    1、就是代替了你用new方式在内存中生成一个类的对象实例,可以根据名称找到你的类定义,生成对象。因为java class类是特定了结构的,所以反射方法可以往你的内存里按定义填。
    2、很多框架根源就是用了反射机制,像Spring,你往配置文件里一配,就知道你的接口该由哪个类来实现,换个实现的话把这个文件一改就行了,不用动代码。
    3、不太了解;
    4、动态代理和静态代理当然都是代理,就是帮助间接生成对象,去除依赖。静态的话,只是相当于中间加了一层,如果被代理的改变了,它也得跟着改吧;动态代理我想可以以传参的方式,实现通用性。
      

  3.   

    代理:
    public class TestHandler implements InvocationHandler
    {
        Object target;
        
        public Object getProxy(Object target)
        {
            this.target = target;
            
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }
        
        public Object invoke(Object arg0, Method arg1, Object[] arg2)
            throws Throwable
        {
            // TODO Auto-generated method stub
            System.out.println("before");
            Object result = arg1.invoke(target, arg2);
            if ("test".equals(result))
            {
                result = "fuck";
            }
            
            System.out.println("after");
            return result;
        }
        
    }
      

  4.   

    package util;import util.ConfigUtil;
    /**
     * 工厂方法
     * 根据输入的接口名字.class 动态的生成实现这个接口的实现类的一个实例
     * @author fangjuyue
     *
     */
    public class DAOFactory { public static Object getInstance(Class c){
    String interfacename = c.getSimpleName();
    String classname = ConfigUtil.getProperty(interfacename);
    Object obj = null;
    try {
    obj = Class.forName(classname).newInstance();
    } catch (Exception e) {
    e.printStackTrace();

    return obj;
    }
    }
    package util;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    /**
     * 读取DAO的配置文件  将dao和dao的实现类想对应   返回实现类的className全路径
     * @author fangjuyue
     *
     */
    public class ConfigUtil {
    private static Properties props = 
    new Properties();
    static{
    /**
     * 读取配置文件
     */
    InputStream ips  = 
    ConfigUtil.class.getClassLoader()
    .getResourceAsStream("daoconfig.properties");
    try {
    props.load(ips);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static String getProperty(String key){
    return props.getProperty(key);
    }
    }daoconfig.properties文件如下
    EnterpriseDAO=dao.impl.EnterpriseDAOImpl
    CustomerDAO=dao.impl.CustomerDAOImpl
    CarMessageDAO=dao.impl.CarMessageDAOImpl
    GoodsDAO=dao.impl.GoodsDAOImpl
    ManagerDAO=dao.impl.ManagerDAOImpl
    PlacardDAO=dao.impl.PlacardDAOImpl
      

  5.   

    学ssh之后就知道,这些框架好多功能都是用反射机制实现的,当然自己就很少用到反射机制,毕竟框架都封装好了。。不过我在开发的时候也用到过。就是将一个String[]转化为某个类的响应属性,反过来,把某个类的所有属性转换为String[]。如String[] students = {"id","100","name","张三","age","25"};转换到
    class Student
    {
    Integer id;
    String name;
    Integer age;
    }的每个属性里。。