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

Java 反射

2018-07-20 18:34 176 查看
反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。

测试类代码如下:

class Person {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Person() {}

public Person(String name) {
this.name = name;
}
}

构造方法Constructor

import org.junit.Test;

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

public class ReflectTest {
@Test
public void demo1() throws Exception {
String className = "Person";
Class clazz = Class.forName(className);     //获得字节码对象

Constructor[] constructors = clazz.getConstructors();
System.out.println(constructors.length);

Object o1 = clazz.getConstructor().newInstance();
Person p1 = new Person();
System.out.println(o1.getClass() == p1.getClass());

Object o2 = clazz.getConstructor(String.class).newInstance("sketch");
Person p2 = new Person("sketch");
System.out.println(o2.getClass() == p2.getClass());

System.out.println(o1.getClass() == o2.getClass());
}
}

输出如下:

2
true
true
true

不难看出,获得的 是 同一个 字节码对象。

成员变量Field

@Test
public void demo2() throws Exception{
Person p = new Person("sketch");

String className = "Person";
Class clazz = Class.forName(className);     //获得字节码对象

Field[] fields = clazz.getDeclaredFields();
System.out.println(fields.length);

Field name = clazz.getDeclaredField("name");
name.setAccessible(true);

Object value = name.get(p); //p.getName()
System.out.println(value);

name.set(p, "Tara");    //p.setName("Tara")
System.out.println(name.get(p));
}

输出如下:

1
sketch
Tara

方法Method

@Test
public void demo3() throws Exception {
Person p = new Person();

String className = "Person";
Class clazz = Class.forName(className);     //获得字节码对象

Method setName = clazz.getDeclaredMethod("setName", String.class);
//如果执行静态方法,第一个参数obj传入null
setName.invoke(p, "sketch");    //p.setName("sketch")

Method getName = clazz.getDeclaredMethod("getName", null);
//如果执行静态方法,第一个参数obj传入null
Object name = getName.invoke(p, null);  //p.getName()
System.out.println(name);
}

输出如下:

sketch
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JUnit Java