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