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

来源:互联网 发布:淘宝免费买东西的技巧 编辑:程序博客网 时间:2024/05/22 08:52

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

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

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

package TestReflection;/*** @author 善水 E mail:wangyweb@163.com* @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:wangyweb@163.com* @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();    }}

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

原创粉丝点击