您的位置:首页 > 编程语言 > Java开发

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

2017-11-01 23:19 423 查看
原则上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();
}

}


以上就是反射机制的最基本问题,后面的很多操作都基于这一思想的实现。在上面的例子中需要注意反射机制对类私有属性和方法的操作。这与面向对象所学的封装性有一点出入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息