java反射的使用

java反射的使用

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。

2 反射机制

Java反射机制主要提供了以下功能
    在运行时判断任意一个对象所属的类
    在运行时构造任意一个类的对象
    在运行时判断任意一个类所具有的成员变量和方法
    在运行时调用任意一个对象的方法

                                      3 Class对象

class对象是Reflection故事起源。要想操纵类中的属性和方法,都必须从获取Class对象开始
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生与之对应的一个Class对象。
Class类没有公共构造方法。Class对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。

4 java.lang.reflect

java.lang.reflect包下:
    Field 类:代表类的成员变量(成员变量也称为类的属性)。
    Method类:代表类的方法。
    Constructor 类:代表类的构造方法。
    Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

代码展示

package com.oracle.test;

public class Employee {
    static String name;
    private static int age;
    public Employee() {
        System.out.println("无参数构造方法");
    }
    public Employee(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return "hello,my name is " + name + "," + age + " years old";
    }
    private void work(String name,int age) {
        this.name=name;
        this.age=age;
        System.out.println("working..."+name+"年龄为"+age);
    }
}

利用反射技术,得到上面实体类的属性方法以及构造方法,并对该类中的方法进行调用

package com.oracle.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 反射的测试
 * @author jacks.li
 *
 */
public class TestReflact {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        Class<?> clazz = Class.forName("com.oracle.test.Employee");
    
                        //获取构造方法
        Constructor<?>     conStr    = clazz.getConstructor(String.class,int.class);
            //根据获得的构造方法获得实例
        Employee employee = (Employee) conStr.newInstance("jacks.li",18);
        System.out.println(conStr);
        //获取声明的属性
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field field:declaredFields ){
            System.out.println("属性的名称"+field.getName()+"属性的修饰"+field.getModifiers()+"获取属性类型"
                    
                    +field.getType());
        }
        //获得声明的方法
                        /*    Method[] declaredMethods = clazz.getDeclaredMethods();
                            for(Method method:declaredMethods){
                                System.out.println("获得方法名称"+method.getName());
                                System.out.println("获得方法返回类型"+method.getReturnType());
                                System.out.println("获得方法修饰"+method.getModifiers());//0代表默认权限、1代表public、2代表private(static,final也都是修饰)
                                System.out.println("获得方法的参数"+Arrays.toString(method.getParameters()));
                            }*/
        //方法的调用
        Method workMethod = clazz.getDeclaredMethod("work", String.class,int.class);
        workMethod.setAccessible(true);
        workMethod.invoke(employee, "jacks.li",19);
}
}

 

posted @ 2017-06-22 15:29  打开了一扇窗  阅读(448)  评论(0)    收藏  举报