当前位置:  编程技术>java/j2ee

Java反射机制的实现详解

    来源: 互联网  发布时间:2014-10-24

    本文导语:  很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术. 与反射有关的类包. java.lang.reflect.*;和java.lang.Class; Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class。即每一个类型,...

很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.


与反射有关的类包.

java.lang.reflect.*;和java.lang.Class;


Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class。即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共构造方法。注意不是没有,是没有公共的.


如何获得Class对象

代码如下:

.针对每一个对象.getCalss(),可以得到对应的Class.
.Class.forName(String),String的写法:包名.类名.就会创建包名.类名对应的那个对象
注:1.2只适用于引用类型
.对于基本类型:封装类.TYPE代表了对应的基本类型的Class对象.Integer.TYPE对应的是int的Class对象
注:3只适用于基本类型
.类型,Class。
上面的4种方法,只有方法2是动态的,只要换一个包就可以了.它具有动态潜质.所以真正意义的想体现动态编程只能使用方法2.

每种类型的Class对象只有一个,即他们的地址只有一个,但是不同类型是不同的.

所以下面的打印结果都为true.

代码如下:

//对与引用类型
Class c1 = "".getClass();
Class c2 =     Class.forName("java.lang.String");
Class c3 = String.class;
System.out.println(c1 ==c2);//true
//对于基本类型
Class num1 = Integer.TYPE;
Class num2 = int.class;
System.out.println(num1 == num2);//true

反射获取类中的成员的相关方法

[获取构造](使用时一般用不带declared的)

代码如下:

Constructor getConstructor(Class... parameterTypes)
      返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
 Constructor[] getConstructors()
      返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
 Constructor getDeclaredConstructor(Class... parameterTypes)
      返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
 Constructor[] getDeclaredConstructors()
      返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

[获取属性](使用时一般用是带declared的,因为属性一般都是私有的)
代码如下:

Field getField(String name)
      返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
 Field[] getFields()
      返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
 Field getDeclaredField(String name)
      返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
 Field[] getDeclaredFields()
      返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

[获取方法](使用时一般用不带declared的)
代码如下:

Method getMethod(String name, Class... parameterTypes)
      返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
 Method[] getMethods()
      返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
 Method getDeclaredMethod(String name, Class... parameterTypes)
      返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
 Method[] getDeclaredMethods()
      返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
 T newInstance()
      创建此 Class 对象所表示的类的一个新实例。
 String toString()
      将对象转换为字符串。

注意:

new Instance()调用的是无参构造,如果该类没有无参构造方法,则newInstance()会产生异常.

有declared的方法是支持私有,但是不支持继承,无declared的方法支持继承,不支持私有,且只能取出public的东西.

因此取属性的时候一般来说是带declared的,因为属性一般都是私有的,取方法时一般是不带declared的,取构造时一般也是不带declared的.

实例模拟反射获取类中的相关属性和方法

利用反射对属性赋值

Field中的方法

 Object get(Object obj)

  返回指定对象上此 Field 表示的字段的值。

      Field f = c.getXXField(属性名);

      值 = f.get(对象);

 void set(Object obj, Object value)

  将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

  f.set(对象,值);

 Class getType()

  返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。

      用于获取属性的类型(返回Class对象).

代码如下:

Class c = Student.class;
    Object obj  = c.newInstance();            //创建Student类的对象
    Field f = c.getDeclaredField("name");        //获取name属性
    f.setAccessible(true);                    //设置私有可以访问.
    f.set(obj, "zhangsan");
    System.out.println(f.get(obj));             //获取obj的name属性的值.

利用反射调用构造

对于构造真正调用是在调用newInstance()方法时.

代码如下:

Class c = Class.forName("com.clazz.reflect.Student");
    Constructor con = c.getConstructor();         //没有执行构造,
    Object cObj = c.getConstructor().newInstance();//调用无参的构造方法
    Constructor conAll = c.getConstructor(int.class,String.class,int.class);
    Object caobj = conAll.newInstance(1001,"zjamgs",234235);//调用含参的构造方法.
    System.out.println(caobj);                  //打印输出

利用反射调用方法

对象.方法名(值1,2,3);

Method m = c.getMethoed(方法名,参数类型...);

m.invoke(对象,方法调用的参数 )如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

代码如下:

Class c = Class.forName("com.clazz.reflect.Student");
    Object obj = c.newInstance();    //创建Sutdent对象.
    Method msetName = c.getMethod("setName", String.class);//obj无须转换类型
    msetName.invoke(obj, "zhangsan");//调用方法setName, 并传参.
    Method msetId = c.getMethod("setId", int.class);
    msetId.invoke(obj, 409090202);
    System.out.println(obj);

反射应用实例

实体类

代码如下:

package org.dennisit.reflect.entity;
import java.io.Serializable;
/**
 *
 *  User.java   
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年    哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版 iis7站长之家
 *   
 *  @since     : 1.0        创建时间:    2013-2-26        下午01:43:56
 *    
 *  TODO     :    class User.java is used for ...
 *
 */
public class User implements Serializable{

    private String test;

    public void execute(String name,int age){
        System.out.println("name=" + name + ",age=" + age);
    }
}


反射测试类
代码如下:

package org.dennisit.reflect.main;
import java.lang.reflect.Field;
/**
 *
 *  ReflectEx.java   
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年    哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版 iis7站长之家
 *   
 *  @since     : 1.0        创建时间:    2013-2-26        下午01:46:00
 *    
 *  TODO     :    class ReflectEx.java is used for ...
 *
 */
public class ReflectEx {

    public static void main(String[] args)throws Exception {
        Class cls = Class.forName("org.dennisit.reflect.entity.User");
        Object obj = cls.newInstance();       //创建User的对象
        Field f = cls.getDeclaredField("test");    //获取test属性
        f.setAccessible(true);                    //打开私有属性test的访问权限
        f.set(obj, "zhangsan");                    //为test重新复制
        System.out.println(f.get(obj));            //获取obj的test属性值
        //根据方法名execute获取方法
        java.lang.reflect.Method m = cls.getMethod("execute", String.class, int.class);
        m.invoke(obj, "dennisit",23);            //调用execute方法
    }
}


运行效果
代码如下:

zhangsan
name=dennisit,age=23

编写一个反射动态实例化类的例子
代码如下:

package org.dennisit.reflect.main;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
/**
 *
 *  DynamicReflect.java   
 *
 *  @version : 1.1
 * 
 *  @author  : 苏若年    哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版 iis7站长之家
 *   
 *  @since     : 1.0        创建时间:    2013-2-26        下午01:58:12
 *    
 *  TODO     :    利用反射动态实例化的例子
 *
 */
public class DynamicReflect {

    public static Object getInstance(String className,Map map)throws Exception{
        Class c = Class.forName(className);
        Object obj = c.newInstance();                //对象对象
        Set keys = map.keySet();            //获取对应的所有属性
        Field[] fAll = c.getDeclaredFields();        //获取类中所有属性
        for(int i=0;i


    
 
 

您可能感兴趣的文章:

  • Java 反射封装库 Mirror
  • 高手请进:JAVA中的“反射”是什么?
  • java增强开发类,反射工具 absir-core
  • 关于JAVA反射实现的问题
  • 请问java.lang.reflect这个包(反射)的主要用途?java.lang.reflect.Method这个类是干什么用的?
  • java反射机制示例
  • java反射使用示例分享
  • java根据方法名称取得反射方法的参数类型示例
  • Java反射学习 getClass()函数应用
  • java利用反射实现动态代理示例
  • java反射android的r文件的示例
  • Java反射工具包 reflectutils
  • Java 反射之私有字段和方法详细介绍
  • Java 采用反射获取class属性值的实现代码
  • Java反射机制(Reflection)浅析
  • java类加载器和类反射使用示例
  • java反射实现javabean转json实例代码
  • java反射机制示例详解
  • java反射机制实战示例分享
  • java反射技术与类使用示例
  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • 哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版
  • 请问哪儿有java2编程详解的电子书下载??本人急需!!跟贴有分!!!
  • 谁有JAVA的类库详解或下载地址?
  • 请问那里有《JAVA2编程详解》可以下载?
  • 《Java 2 编程详解》程序清单14.12中的一个问题。
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • 我非常想知道JAVA跟C/C++对于硬件控制的能力孰强孰弱.(菜鸟问题,要详解,在线等待)
  • Java中的随机数详解
  • 深入分析Java内存区域的使用详解
  • Java加载JDBC驱动程序实例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JAVA有没有强制回收机制?
  • java中组件的绘制机制。详细讲一下,谢谢了!
  • 请各位大哥告知JAVA中消息机制的有关资料,拜托!
  • java中消息处理的机制?
  • java的事件处理机制如何运用?
  • JAVA中有没有类似C中的select、poll机制的类包来实现线程并发控制
  • 问个java扩展机制问题..
  • 请关注一下java的事件机制!
  • java多线程中的异常处理机制简析
  • 基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍
  • java异常机制分析
  • java异常处理机制示例(java抛出异常、捕获、断言)
  • 学习JAVA响应事件的机制——————200分言谢————————
  • Java进阶教程之运行时类型识别RTTI机制
  • 我想问一下java的事件驱动机制是如何实现的,如何实现自定义的事件驱动?不够再加100!
  • Java 多线程同步 锁机制与synchronized深入解析
  • 初探Java类加载机制
  • Java反射机制的学习总结
  • JAVA反射机制实例教程
  • Java序列化机制与原理的深入分析
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3