Java笔记-反射机制Reflection API(java动态机制)基础

原则上java不是动态语言的范畴,比如python PHP。但是反射机制的出现使得java在一定意义上实现了动态语言的特征的。通过反射机制的API可以动态的获取运行时的类的内部信息或者类的结构信息。并且能够操作类的实例的对象和方法。

Java反射机制提供如下的功能:
1.在运行时判断任意一个对象的所属的类。
2.在运行时创建任何一个类的对象实例。
3.运行时获取任意一个类的所有的属性和方法(包括私有属性和方法)。
4在运行时调用和操作任意类的属性和方法。

下面是我的运行demo:
首先新建一个person类

package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 创建时间:Nov 1, 2017 10:14:50 PM
* 类说明
*/
public class Person {
    public String name = "王云";
    public int age = 22;
    private String sex = "男士";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    public Person(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }


    public void show() {
        System.out.println("我叫"+name+",我是一个"+sex+",今年"+age+"岁 了.");

    }

    public void display() {

        System.out.println("我是一个人!");
    }

public void display1(String nation) {

        System.out.println("我是一个"+nation+"人");


    }
}

后面是
反射测试代码:

package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 创建时间:Nov 1, 2017 10:18:12 PM
* 类说明
*/

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


import org.junit.Test;

public class TestRelf {

//  在不使用反射机制之前的面向对象的基本类操作
    @Test
    public void  test1(){
        Person  p1 = new Person();
        p1.setName("刘德华");
        p1.setAge(45);
        p1.setSex("男士");

        p1.display();
        p1.show();
    }

//  使用java的反射机制实现对运行时类的操作
    @Test
    public void test2() throws Exception {
        Class<Person> pClass = Person.class;
//      创建类的实例
        Person person = pClass.newInstance();
//      获取属性
        Field fname = pClass.getField("name");
        fname.set(person, "周星驰");

        Field fage = pClass.getField("age");
        fage.set(person, 55);

        Method method1 = pClass.getMethod("display1", String.class);
        method1.invoke(person, "HK");

        Method method2 = pClass.getMethod("setName", String.class);
        method2.invoke(person, "张学友");

//      重点:与封装性的原则对立,private的属性获取
//
//      Field fsex = pClass.getField("sex");错误:因为声明 的是私有变量
//      fsex.set(person, "nanshi");
//      以下的就会运行成功
        Field fsex = pClass.getDeclaredField("sex");
        fsex.setAccessible(true);
        fsex.set(person, "女士");
        person.show();
//      person.display();
    }

}

以上就是反射机制的最基本问题,后面的很多操作都基于这一思想的实现。在上面的例子中需要注意反射机制对类私有属性和方法的操作。这与面向对象所学的封装性有一点出入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章