日期:2014-05-19  浏览次数:20730 次

最近在研究java的反射机制,我也“研究”了一天,谁给分享下这方面自己的理解
1、反射的定义,通俗点举个例子就行。
2、项目中常用到不,如果用到,一般是解决什么问题或这需求,最好也能举个例子。
3、还有代理那一块,就是invocationhindler接口,proxy类,如何应用
4、动态代理,和静态代理异同点。



小弟已经研究过了,就是感觉自己掌握的有些模糊,所以想请各位说下自己的理解。

对比一下自己的理解,这样获取能够扬长避短,嘿嘿,学习学习。。。

最后谢谢回复的网友。。。

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

------解决方案--------------------
代理:
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;
}

}
------解决方案--------------------
反射可以直白的理解为:仅应对代码可见部分编程。
是处理通用编程方法。


仅应对代码可见部分编程。

这个稍稍解释一下,就是使用一般反射方法的地方,不会受到代码产生的中间结果影响,也不会受到业务逻辑影响,完全根据“代码”编程的。所以能够应用到很多需要解耦和编写框架的地方。

这个感觉不用学太深,学到够用再多一点即可。毕竟处理业务逻辑才是真正的面向客户的。
------解决方案--------------------
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


------解决方案--------------------
学ssh之后就知道,这些框架好多功能都是用反射机制实现的,当然自己就很少用到反射机制,毕竟框架都封装好了。。不过我在开发的时候也用到过。就是将一个String[]转化为某个类的响应属性,反过来,把某个类的所有属性转换为String[]。

如String[] students = {"id","10