什么是反射机制,有什么作用

1. 反射机制定义

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改其本身状态或行为的一种能力。

在Java环境中,反射机制允许程序在执行时获取某个类自身的定义信息,例如熟悉和方法等也可以实现动态创建类的对象、变更属性的内容或执行特定的方法的功能。从而使Java具有动态语言的特性,增强了程序的灵活性和可移植性。

2. 反射机制的作用

Java反射机制主要用于实现以下功能。

(1)在运行时判断任意一个对象所属的类型。

(2)在运行时构造任意一个类的对象。

(3)在运行时判断任意一个类所具有的成员变量和方法。

(4)在运行时调用任意一个对象的方法,甚至可以调用private方法。

注意:上述功能都是在运行时环境中,而不是在编译时环境中。

3. Java反射机制API

实现Java反射机制的API在Java.lang.reflect包下,具有以下几点。

(1)Class类:代表一个类。

(2)Filed类:代表类的成员变量。

(3)Method类:代表类的方法。

(4)Constructor类:代表类的构造方法。

(5)Array类:提供了动态创建数组及访问数组元素的静态方法。该类中的所有方法都是静态的。

4. 应用示例

(1)根据类名获取类中定义的所有属性和方法,实例代码如下:

package day0105;  

import java.lang.reflect.Array;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  


public class Reflect {  
    /** 
     *  
     *打印出String类所有的属性和方法 
     */  
    public void test1(){  
        Class c = String.class;  
        Method[] methods = c.getMethods();  
        for(int i = 0;i<methods.length;i++){  
            System.out.println(methods[i].getName());  
        }  
        Field[] fields = c.getFields();  
        for(Field f : fields){  
            System.out.println(f.getType()+":"+f.getName());  
        }  
    }  

    /** 
     * 根据类名动态创建类的对象 
     * @throws Exception 
     */  
    public void test2() throws Exception{  
        Class c = Class.forName("day0105.Student");  
        Student student = (Student)c.newInstance();  
        student.setName("java");  
        student.setId("1001");  
        student.show();  
    }  

    /** 
     * 根据类名和方法名,执行对象的方法 
     * @param student 
     * @param method 
     * @param value 
     * @throws Exception 
     */  
    public void test3(Student student,String method,String value) throws Exception{  
        String s1 = method.substring(0,1).toUpperCase();  
        String s2 = method.substring(1);  
        String m = "set"+s1+s2;  
        System.out.println(m);  
        Class c = student.getClass();  
        Method set = c.getMethod(m,new Class[]{String.class});  
        set.invoke(student,new Object[]{value});  
    }  

    /** 
     * 动态创建数组对象,对数组元素复制和取值 
     */  
    public void test4(){  
        try{  
            Class cls = Class.forName("java.lang.String");  
            //创建一个String类型的数组,大小为10  
            Object arr = Array.newInstance(cls, 10);  
            //在数组5索引的位置赋值  
            Array.set(arr, 5, "this is a test");  
            //获取数组5索引位置的值  
            String s = (String)Array.get(arr, 5);  
            System.out.println(s);  
        }catch(Throwable e){  
            System.out.println(e);  
        }  
    }  
} 

Student类的定义如下

package day0105;  

public class Student {  
    private String id;  

    private String name;  

    public String getId() {  
        return id;  
    }  

    public void setId(String id) {  
        this.id = id;  
    }  

    public String getName() {  
        return name;  
    }  

    public void setName(String name) {  
        this.name = name;  
    }  

    public void show(){  
        System.out.println(id+":"+name);  
    }  
}  

Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,
无需提前硬编码目标类。这些特性使得反射特别适用于创建以普通方式与对象协作的库。
反射在性能方面会有一定的损耗,用于字段和方法接入时反射要远慢于直接写代码。如果它作为程序
运行中相对很少涉及的部分将不会造成影响,因为即使测试最坏情况下的计时图显示的反射操作也只耗用几微秒。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值