最近在研究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