- 浏览: 99665 次
- 性别:
- 来自: 深圳
最新评论
-
weizaiC:
[flash=200,200][/flash]
ExtJS实现下拉列表级联 -
yanxunjian:
Java实现读取xml文件sql配置转换为JDBC SQL
...
Java实现读取xml文件sql配置转换为JDBC SQL -
road_16:
奶奶的,大妹子的
ExtJS实现下拉列表级联 -
road_16:
2.0版本的前台显示不了数据,3.0版本的才可以,检查了大半天 ...
ExtJS实现下拉列表级联 -
road_16:
怎么不说明extjs所使用的版本呢?版本不一样,写法也是不同的 ...
ExtJS实现下拉列表级联
Java的反射机制可以理解成,Java类Class信息的各个成分都是用类来表示,Java里面有个很特殊的类就是Class,其包含了Method、Field、Constructor等信息,都是用类来表示。获取Java的Class信息,有几种办法(ReflectVo)
1、Class clazz = ReflectVo.Class;获取字节码
2、Class clazz = Class.forName("类所在的包的信息");
3、通过对象获取:ReflectVo vo = new ReflectVo(); Class clazz = vo.getClass();
获取了类的字节码信息后,我们就可以通过反射机制获取类的信息,而不需要去new这个类,返回的就是Object类,当我们不明白类的信息的时候,我们就可以这样的去实现。返回的结果包含的类的信息,也可以调用其方法(invoke())等。
当程序运行加载的时候,JVM运行时候,可以动态的去修改类的信息,从而实现类的动态化和强大的功能。
下面就是我自己写了一个例子:
/** * ReflectVo.java V1.0 May 5, 2012 1:24:16 PM * * Copyright Lizhenbin Co. ,Ltd. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.lzb.reflect; import java.util.Date; /** * * 功能描述: 测试Java的反射机制 * * @author lizhenbin * * <p>修改历史:(修改人,修改时间,修改原因/内容)</p> */ public class ReflectVo { public static String text_001 = "123456789_lzb_number"; public static String text_002 = "abcdefg_lzb_letter"; public static String text_003 = "abcd12345_lzb_all"; public static String text_name = "lzb"; private String id; private String context; public Date createDate; protected int limitNum; /** * 方便使用newInstance() * 构造函数: * */ public ReflectVo() { super(); } /**] * * 构造函数:传入public, private, protected作用域的值 * * @param id * @param createDate * @param limitNum */ public ReflectVo(String id, Date createDate, int limitNum) { super(); this.id = id; this.createDate = createDate; this.limitNum = limitNum; } /** * * 构造函数:全部属性 * * @param id * @param context * @param createDate * @param limitNum */ public ReflectVo(String id, String context, Date createDate, int limitNum) { super(); this.id = id; this.context = context; this.createDate = createDate; this.limitNum = limitNum; } @Override public String toString() { return "Modefy Str Result: " + "\n\n " + "TXT001: " + this.text_001 + "\n" + " TXT002: " + this.text_002 + "\n" + " TXT003: " + this.text_003 + "\n" + " TXT_EDITOR: " + this.text_name; } // 设置一个公有的方法 public void msgReflectVo(String msg) { System.out.println("\nCall Private Method. " + msg); } //设置一个私有的方法 private void queryReflectVo(String msg) { System.out.println("Call Private Method. " + msg); } // protected方法 protected void proReflectVo(String msg) { System.out.println("Call protected Method<-----"); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getContext() { return context; } public void setContext(String context) { this.context = context; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public int getLimitNum() { return limitNum; } public void setLimitNum(int limitNum) { this.limitNum = limitNum; } }
package com.lzb.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; /** * * 功能描述:利用反射机制构造类,并调用其方法,动态的修改类的信息 * * @author lizhenbin * * <p>修改历史:(修改人,修改时间,修改原因/内容)</p> */ public class ReflectManager { private static String REFLECT_STR = "com.lzb.reflect.ReflectVo"; private Class clazz = null; /** * * 构造函数:初始化 * */ public ReflectManager() { try { this.clazz = Class.forName(REFLECT_STR); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * * 功能描述: * 利用Java的反射机制,在不new对象, 动态的构造信息, * 然后在运行的时候动态的修改类的信息,调用类的参数等。 * * @author lizhenbin * <p>创建日期 :May 5, 2012 3:48:14 PM</p> * * @throws Exception * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public void reflectMsg() throws Exception { /** * 利用反射机制构造对象 * 1、 获取构造方法 * 2、 通过newInstance()传入参数初始化实例对象,并转换成相应的vo信息 */ Constructor cons = clazz.getConstructor(String.class, String.class, Date.class, int.class); Object obj = cons.newInstance("SN000001", "Copyright lizhenbin. All rights reserved.", new Date(), 100); // /** // * 注:当类有无参数的构造方法时,可以使用如下方式 // */ // Object deflateVo = clazz.newInstance(); /** * 把Vo属性里面的常量值,都动态的修改 * 字符串中的"lzb",动态的修改为"lizhenbin" * 这里只演示修改属性的值 */ Field[] fields = clazz.getFields(); for(Field f : fields) { /** * 对所有的值是String类型的修改,则取出所有的String类型的值信息即可 */ if(f.getType()==String.class) { /** * 通过类型获取相应的信息 */ String voStr = (String) f.get(obj); if(voStr!=null && !voStr.equals("")) { String modifyStr = voStr.replace("lzb", "lizhenbin"); /** * 把修改后的值返回 */ f.set(obj, modifyStr); }else{ System.out.println("Usage: Error!"); } } } // 打印 System.out.println(obj); // 调用类的方法 Method method = clazz.getMethod("msgReflectVo", String.class); /** * 调用类的方法用invoke,参数1是反射获得的方法,参数二是传入的参数 */ /** * 参数1: 对象, 参数2: 传入到方法的参数 */ method.invoke(obj, "------>Input datas<-------"); } /** * * 功能描述:执行 * * @author lizhenbin * <p>创建日期 :May 5, 2012 3:40:01 PM</p> * * @param args * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public static void main(String[] args) { ReflectManager rm = new ReflectManager(); try { rm.reflectMsg(); } catch (Exception e) { e.printStackTrace(); } } }
/** * Reflect.java V1.0 May 5, 2012 1:35:01 PM * * Copyright Lizhenbin Co. ,Ltd. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.lzb.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; /** * * 功能描述:利用Java的反射机制获取数据 * * @author lizhenbin * * <p>修改历史:(修改人,修改时间,修改原因/内容)</p> */ public class ReflectClassMessage { private Class clazz = null; /** * * 构造函数:初始化 * */ public ReflectClassMessage() { try { init(); } catch (Exception e) { e.printStackTrace(); } } /** * * 功能描述:初始化,利用反射机制获取类信息 * * @author lizhenbin * <p>创建日期 :May 5, 2012 2:10:15 PM</p> * * @throws Exception * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public void init() throws Exception{ /** * 方式一获取类的字节码 */ // clazz = ReflectVo.class; /** * 方式二,通过对象获取类的字节码 */ // ReflectVo rvo = new ReflectVo(); // clazz = rvo.getClass(); /** * 方式s三获取类的字节码 */ clazz = Class.forName("com.lzb.reflect.vo.ReflectVo"); } /** * * 功能描述:利用反射机制获取类的构造器信息 * * @author lizhenbin * <p>创建日期 :May 5, 2012 2:09:57 PM</p> * * @throws Exception * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public void reflectConstructor() throws Exception{ // 获取所有的构造方法 Constructor[] cons = clazz.getConstructors(); for(Constructor c : cons) { System.out.println(c); } // 获取指定的构造方法,需要传入去参数类型 Constructor consType = null; consType = clazz.getConstructor(String.class, Date.class, int.class); System.out.println("-------->" + consType); consType = clazz.getConstructor(); System.out.println(consType + "<---------"); } /** * * 功能描述:反射的方式获取类的方法信息 * * @author lizhenbin * <p>创建日期 :May 5, 2012 2:09:09 PM</p> * * @throws Exception * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public void reflectMethods() throws Exception { // 获取类所有的公有(public)方法信息,包括父类 Method[] ms = clazz.getMethods(); for(Method m : ms) { System.out.println(m); } // 获取类的所有方法信息,不包括父类的 ms = clazz.getDeclaredMethods(); for(Method m : ms) { System.out.println("----->" + m); } // 获取公有方法 Method m = clazz.getMethod("msgReflectVo", String.class); // 获取私有的方法 m = clazz.getDeclaredMethod("queryReflectVo", String.class); } /** * * 功能描述:获取属性 * * @author lizhenbin * <p>创建日期 :May 5, 2012 2:24:17 PM</p> * * @throws Exception * * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p> */ public void reflectField() throws Exception { Field[] fs = clazz.getFields(); // 获取公有的属性 Field f = clazz.getField("createDate"); System.out.println(f); // 获取私有属性 f = clazz.getDeclaredField("context"); System.out.println(f); } }
发表评论
-
poi创建Excel设计
2013-11-18 22:32 768电商商务,目前为止,做网站后台管理系统对到处数 ... -
程序员改变命运之程序,500W来了,信不信由你,每天JAVAC编译一下,JAVA一下500W就来了
2012-08-20 18:43 63胡乱写了一个随机数“双色球”程序,都是随机数,500W你信就有 ... -
JAVA读写文件基本方法
2012-08-20 09:30 869JAVA读写文件的基本方法,Reader 类是 J ... -
Java实现读取xml文件sql配置转换为JDBC SQL
2012-06-26 18:46 2437公司的框架都是用原生的JDBC框架,其中操作数据很 ... -
主键字符串自增Java实现
2012-06-09 17:41 5542程序实现字符串主键自增,例如:“SN000001” ... -
将Java字符串数组转化成对应的Entity
2012-06-06 09:14 3744最近新工作的 ... -
将简单的POJO转化为JSON或者XML
2012-05-10 18:04 1935利用反射机制获取类的信息,然后将所得的信息,转化成JSON数据 ... -
UDP通信
2012-05-10 17:54 913UDP通信,发送端发送数据,接受端接收数据,发送端发送数据不需 ... -
Java遍历、删除Map
2012-05-10 17:42 3495面试的时候,遇到一个很尴尬的事情,就是面试官问怎么 ... -
Java使用JXL创建Excel文件
2012-05-10 17:24 1907以前写过用jxl读取excel的,但是一直没有写 ... -
Java创建xml与排序
2012-05-05 19:53 2706DOM创建xml package com.lzb.model ... -
Java多线程
2012-05-05 19:49 785一个很有意思的题目,网上看到的,自己写了一下 题目的大概意思 ... -
TCP通信
2012-04-27 16:22 946TCP通信的一个模板 TCP的服务端用while一直接收客户 ... -
Java实现IP地址定位地址信息
2012-03-14 11:06 11304做电子商务网站的时候,网站的头部一般都有显示是哪个 ... -
Java文件操作
2012-02-07 16:34 850在工作中,经常要获取到文件所在的路径和创建文件夹,这里补充一下 ... -
MD5类使用
2012-01-12 11:13 1013对用户注册的密码加密类,采用MD5算法,留着以后用 注意,B ... -
验证码生成
2012-01-12 10:19 900系统登陆或者注册的时 ... -
Java取时间的一个类
2012-01-09 14:43 1141整理了一下自己开发过程中经常使用到的一个时间类,当做工具类使用 ... -
jdbc连接池
2011-12-30 16:49 875自己整理的一个JDBC驱动,方便以后离开框架直接测试,在mys ... -
Java创建文件和文件路径
2011-12-30 16:30 1853最近在开发过程中,经 ...
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
java 反射机制深入理解,java 反射机制深入理解,java 反射机制深入理解,
java反射机制和动态代理的原理,熟悉反射机制和动态代理
Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了
Java反射机制的实现_Reflection,适合学习了解反射机制。
一个例子8个demo让你了解Java反射机制
java反射机制的一些源代码,我学习的笔记,需要的可以下载看看
描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。
Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用
Java反射机制总结(实例分析) Java反射机制学习笔记
候捷谈Java反射机制 有助深入理解Java新特性
深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破
java反射机制,代码/..安逸.不要错过
自己总结的java反射机制的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
java反射机制原理和反射机制总结!!! java反射机制原理和反射机制总结!!!
java反射机制的实战练习
反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...
java反射机制源码java反射机制源码java反射机制源码