反射机制,它到底有什么用处?

xtfdc2 2014-09-04 06:24:22
正在学Java反射机制,还没学完,由于买了本垃圾书,上面就没有这块知识,只能从网上找些资料来看,只言片语凑不完整,现在大概知道反射是怎么回事。大概意思就是:幼儿园里跑着很多孩子,抓过一个孩子一问就能知道他爹是谁。
抓过来一个对象,就能知道它的类,并且还能知道类里面的结构。
能用已有的一个对象,来实例化一个新对象。

但例题却是这样的:
Class c1=Person.class;
Class c2=Class.forName("Person");
Object o=c1.newInstance();

看上去似乎是很好很有用,但实际上我Person里自己定义的方法,比如用o.display就不能用,用子类初始化父类,会丢失子类特有的部分,这样实例化有什么用?还不如直接Object o=new Object();
还用了两个getClass,getName,打印出对象所属的类,但不知道这在以后会有什么用处。
我感觉反射应该不仅是这样的吧?各位大大能否给举两个实用的例子?不要太深就好,兄弟初鸟。
...全文
1006 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
TMZ794600991 2014-09-17
  • 打赏
  • 举报
回复
最近项目用到springjdbc,但我又不想自己写基础的sql,所以我采用了反射+注解模拟hibernate的简单功能,来完成对象到sql的解析以及查询结果到对象的转换,贴出一点项目实际的代码 自定义注解类:HLBean.java

@Documented
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)

public abstract @interface HLBean {

	/**
	 * 实体对象表名
	 * */
	public String tableName() default "className";
}
实体对象:InternalNoticeBean .java

@HLBean(tableName = "t_yw_neibugg")
public class InternalNoticeBean extends BaseBean implements Serializable {

	private static final long serialVersionUID = 6582029951820426081L;

	@HLColumn(commont = "主键", length = 20)
	private Long id;

	@HLColumn(commont = "标题", length = 50)
	private String biaoti;

	@HLEnum(enumName = "TOPTYPESTATE")
	@HLColumn(commont = "置顶", length = 1)
	private Integer isZhiD;

	@HLEnum(enumName = "ACCEPTTYPESTATE")
	@HLColumn(commont = "分类", length = 1)
	private Integer fenlei;

	@HLColumn(commont = "内容", length = 1000)
	private String neirong;

	@HLColumn(commont = "接受人类型", length = 1)
	private Integer jieshouLX;
}
反射解析类:FieldsToSql .java(将对象转为sql根据自己定义的规则) public final class FieldsToSql { protected static final Logger log = org.apache.log4j.Logger .getLogger(BeanToSql.class); // 解析增加属性 public final static void pasreClass4Insert(Object bean, StringBuilder sb1, StringBuilder sb2, Field[] fields) { for (Field field : fields) { // 设置强制访问 field.setAccessible(true); if (field.getAnnotation(HLTransient.class) != null) { continue; } // 属性名称 String fieldName = field.getName(); // 不需要解析的属性 if (BeanUtil.INCLUDEFIELDLIST.contains(fieldName)) continue; // 类型 Class<?> fieldType = field.getType(); // 属性值 try { Object value = field.get(bean); //值为空则跳过 if(value == null){ continue; } sb1.append(","); sb1.append(fieldName); if (fieldType.equals(String.class)) { sb2.append(","); if (value == null) { sb2.append("null"); } else { sb2.append("'"); sb2.append(((String) value).trim()); sb2.append("'"); } } else if (fieldType.equals(int.class) || fieldType.equals(Integer.class)) { sb2.append(","); sb2.append("'" + value + "'"); } else if (fieldType.equals(Date.class)) { sb2.append(","); sb2.append("'" + DateUtil.getDateString(((Date) value), "yyyy-MM-dd HH:mm:ss") + "'"); } else if (fieldType.equals(Long.class) || fieldType.equals(Double.class) || fieldType.equals(Float.class)) { sb2.append(","); sb2.append("'" + value + "'"); } } catch (IllegalArgumentException e) { log.error(e.getMessage()); } catch (IllegalAccessException e) { log.error(e.getMessage()); } } }} 以上是部分自己封装的代码 总结:反射加注解,在框架中几乎都需要用到,没有反射就没有框架,ps:如果分儿给我的话可以给你发比较全一点的代码!
qq_20858451 2014-09-17
  • 打赏
  • 举报
回复
spring用的比较多
GlyphVectory 2014-09-13
  • 打赏
  • 举报
回复
2个字:偷懒,非要多加几个字的话:重复利用
  • 打赏
  • 举报
回复
有句话说的好,没有反射,就没有大多数的框架...
cjd96 2014-09-12
  • 打赏
  • 举报
回复
有用处啊,比如说最近做的服务器在不关闭的情况下读excel更换游戏里面的模版数据
糖几颗的 2014-09-12
  • 打赏
  • 举报
回复
不管是做web开发,还是游戏开发. 反射都是非常有用的. 主要是用于在配置文件中声明或者调用对象. 比直接写代码更直观和容易管理. 在那些框架中, 其实配置中的东西, 都可以写到代码里面, 达到的效果是一样的. 但是配置是可以动态加载的, 而类的动态加载就非常非常麻烦了. 配置动态加载就实现了, 服务器在启动过程中可以修改一些参数和方法的调用. 动态加载对于在实际应用中非常非常的重要.
飞翔的卡其啦 2014-09-12
  • 打赏
  • 举报
回复
引用 12 楼 xiaopeipei2004 的回复:
反射是用来留后门的,实现你所有罪恶想法
哈哈 点个赞! ------------------------------------------------------------------------------------- 还用了两个getClass,getName,打印出对象所属的类,但不知道这在以后会有什么用处。 ------------------------------------------------------------------------------------- 主要是用来动态调用方法(类)和AOP拦截方法的。 动态调用 ------------------------------- 比如 现在有个Person类,里面有name,age属性,现在要给name、age赋值,通常需要调用setName和setAge方法。但这样不方便动态调用。比如我现在需要加一个属性sex,就得调用setSex方法赋值。 当属性越来越多时,调用的方法越来越多。 引用了反射机制后,调用getField().getName()可以获取属性名,按照指定的约定拼接字符串获得方法名(一般是"set"(get)+字段名(首字母大写)),然后调用class1.getMethod(获得方法method,最后利用method.invoke()调用指定方法。 这样的好处是,当双方定义好相应的属性和方法名的约定,就可以进行动态调用了 ------------------------------- AOP拦截 ------------------------------- 通过代理类,利用反射机制,对方法前后做拦截,典型的spring事物管理 ------------------------------ 写的很凌乱,不知道看懂否? 如有不对之处,欢迎拍砖
wangzhidavl 2014-09-11
  • 打赏
  • 举报
回复
主要用来写工具类
上网偷代码 2014-09-06
  • 打赏
  • 举报
回复
学习了
流星谜 2014-09-06
  • 打赏
  • 举报
回复
框架里面基本都要用到反射,如果你只是做用户业务,是没有任何用处。
小白晒太阳 2014-09-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/tjpu_lin/article/details/23557443 http://blog.csdn.net/tjpu_lin/article/details/25337109 楼主有学过hibernate或是spring吗,如果学过哪怕是一点点,你看一下我写的学习笔记应该会有点了解。
乔不思 2014-09-06
  • 打赏
  • 举报
回复
框架 主要就是依靠 反射机制 完成
qingyuan18 2014-09-05
  • 打赏
  • 举报
回复
RPC远程调用和AOP切面编程是java类反射最常见的两个应用 RPC远程调用包括RMI,EJB都会使用类反射创建动态代理proxy和调用句柄invoker,以完成本地桩类的工作 AOP切面在Spring中用得很多,在业务逻辑方法前后切入其他程序逻辑,类反射Method可以动态获取到原业务逻辑类的方法,从而实现调用前后的代码切入 其他用到类放射的地方很多,具体参看java.lang.refect源码
再见美丽青春 2014-09-05
  • 打赏
  • 举报
回复
好吧!!我也学习了一下!!
  • 打赏
  • 举报
回复
学框架的时候你就会体会到它的强大
唐三角 2014-09-05
  • 打赏
  • 举报
回复
维护世界和平
Golden_Dog 2014-09-05
  • 打赏
  • 举报
回复
引用 9 楼 xiangnan129 的回复:
反射用在普通简单的自己写的demo上,是完全看不出它的好处和优势的。反射基本上是用来做框架的。像Struts,Spring等框架,离开了反射基本不用玩了。楼主可以去看一下这些框架的运行原理,以及想一想,有一些东西,为什么你没有去传或者是设置,框架自己怎么就能拿到。
+1
grapepaul 2014-09-05
  • 打赏
  • 举报
回复
反射是用来留后门的,实现你所有罪恶想法
yqj2065 2014-09-04
  • 打赏
  • 举报
回复
Java创建对象的两大基本技术是new表达式和反射机制。
scott_129 2014-09-04
  • 打赏
  • 举报
回复
反射用在普通简单的自己写的demo上,是完全看不出它的好处和优势的。反射基本上是用来做框架的。像Struts,Spring等框架,离开了反射基本不用玩了。楼主可以去看一下这些框架的运行原理,以及想一想,有一些东西,为什么你没有去传或者是设置,框架自己怎么就能拿到。
加载更多回复(8)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧