`

java中的反射机制

阅读更多

java中反射机制用于动态的获取运行时类型识别,也就是所谓的RTTI,当你从网络上获取一段字节码的时候,告知你这是一个对象的实例,比如hibernat中的你需要对以一个对象进行持久化,你如何获取到它的字段,setter,getter,如何将它存入到对应的表中。或者将配置文件中的各种不同属性值加载到运行时对象属性中的,这些将通过反射机制来获取;

 

比如下例将一个customer对象通过hibernate保存到数据库中;

这是Customer的代码:

 

public class Customer{
    private int id;
    private String name;
    
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
}
 

 

我们知道在hibernate用session.save的时候,通过具体的配置文件,将在数据库中找到一张名为Customer的表,并且自动的将id属性和name属性存入到数据库中,那么,jvm是如何确定和Customer表名一致的类就是该Customer.class呢?这就是反射机制的作用了,下面是一个简单问题的实现:

import java.lang.reflect.*;

public class ReflectTest{
    public void methodOfReflect(Object o) throws Exception{
        
        Class className = o.getClass();//用于获取该对象的类型信息
        Field[] fields = className.getDeclaredFields();//获取该对象的所有字段名
              
        for(int i=0;i<fields.length;i++){
            Field field = fields[i];
            String name = field.getName();
            
            String firstLetter = name.substring(0,1).toUpperCase();
            
            String getMethodName = "get"+firstLetter+name.substring(1);
            String setMethodName = "set"+firstLetter+name.substring(1);
            
            /* 通过字符串拼接获取到field对应的getter,setter */
            Method getMethod = className.getMethod(getMethodName,new Class[]{});
            Method setMethod = className.getMethod(setMethodName,field.getType());
            
            /* 在对象o上面调用getter方法 */
            Object value = getMethod.invoke(o,new Object[]{});
            valueArray[i] = value;
            System.out.println(name+":"+value);
        }
    }
    
    public static void main(String args[]){
        Customer c = new Customer(10,"JiJi");
        
        ReflectTest rt = new ReflectTest();
        rt.methodOfReflect(c);
    }
}

 上面在获取对应getter和setter的时候会产生类型转换警告,不知道怎么回事,下面的代码清单列出了利用反射机制将对象持久化进数据库,也就是类似于hiberate中的session.save(c):

//Customer.java
public class Customer{
    private int id;
    private String name;
    
    public Customer(int id,String name){
        this.id = id;
        this.name = name;
    }
    
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
}

//ReflectTest.java

import java.lang.reflect.*;

public class ReflectTest{
    private Object[] valueArray;
    public Object[] methodOfReflect(Object o) throws Exception{
        
        Class className = o.getClass();
        Field[] fields = className.getDeclaredFields();
        valueArray = new Object[fields.length];
              
        for(int i=0;i<fields.length;i++){
            Field field = fields[i];
            String name = field.getName();
            
            String firstLetter = name.substring(0,1).toUpperCase();
            
            String getMethodName = "get"+firstLetter+name.substring(1);
            String setMethodName = "set"+firstLetter+name.substring(1);
            
            Method getMethod = className.getMethod(getMethodName,new Class[]{});
            Method setMethod = className.getMethod(setMethodName,field.getType());
            
            Object value = getMethod.invoke(o,new Object[]{});
            valueArray[i] = value;
        }
        return valueArray;
    }
}

//Persistence.java
import java.lang.reflect.*;
import java.sql.*;

public class Persistence{
    public static void main(String arg[]) throws Exception{
        Customer c = new Customer(10,"JiJi");
        
        ReflectTest rt = new ReflectTest();
        Object[] array = rt.methodOfReflect(c);
        
        String sql = "insert into "+c.getClass().getName()+"(id,name) "+"values(";
        for(int i=0;i<array.length;i++){
            if(i == array.length-1)
                {sql += "'"+array[i].toString()+"'"+")";}
            else{sql +="'"+array[i].toString()+"'"+",";}
            
        }
        
        Class.forName("com.mysql.jdbc.Driver");
        COnnection conn = DriverManager.getConnction(url,usr,pwd);
        Statement stat = conn.getStatement();
        ResultSet rs = stat.executeUpdate(sql);
    }
}
 我觉得吧,如果反射机制结合着具体的应用比较好理解,而不是单独去看文档,可能是我实力不够吧。。
分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java面试题--反射机制

    `Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...

    Java中的反射机制

    Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。

    Java反射机制 Java反射机制

    Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射更加安全和强大。 #### 三、Java反射机制的核心概念与应用 1. **核心概念** - **Class对象**:...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    Java 1.5 反射机制

    反射机制的核心是`Class`类,它代表了Java中的每一个类型。通过`Class.forName()`方法,我们可以根据类名获取`Class`对象。一旦有了`Class`对象,我们就可以实例化对象,调用构造器,以及获取类的信息,如类名、...

    JAVA反射机制应用

    在JAVA反射机制中,Class类和Field类、Method类、Constructor类是最重要的三个类,它们提供了访问类、字段、方法和构造函数的能力。 在获取某个对象的属性时,我们可以使用getField方法,例如: ```java public ...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    利用java反射机制的建议计算器源码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性和灵活性。在这个“利用java反射机制的建议计算器源码”中...

    Java反射机制笔记(简单易懂)

    Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

Global site tag (gtag.js) - Google Analytics