版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xd15010130025/article/details/88716940
一.概念
1. Java Reflection
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能操作任意对象的内部属性和方法
2. Java反射机制提供的功能
- 在运行时判断任何一个对象所属的类
- 在运行时构建任意一个类的对象
- 在运行时判断任意一个类具有的成员变量和方法
- 在运行时调用任意一个对象的成员变量和方法
- 生成动态代理
3. 反射相关的主要API:
- java.lang.Class:代表一个类
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造方法
4. Class类
- 特性
在Object类中定义了下面的办法,此方法被所有的子类继承:
public final Class getClass()
以上方法返回值的类型是一个Class类,此类是Java反射的源头,实际上反射从程序的运行结果也很好理解,即:通过对象反射求出类的名称。
正常方式:引入需要的包类名称 通过new实例化 取得实例化对象
反射方式:实例化对象 getClass()方法 得到完整的包类名称
二.实例
Person类
package test;
public class Person {
public String name;
private int age;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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 void show(){
System.out.println("This is class of Person");
}
public void display (String nation){
System.out.println("my nation is:"+nation);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
测试类
package test;
import static org.junit.Assert.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class TestReflection {
//有了反射,通过反射创建对象,并调用其中的方法
@Test
public void test2() throws Exception {
Class clazz=Person.class;
//创建class对应的运行时类Person对象
Person p=(Person) clazz.newInstance();
//调用属性
Field f1=clazz.getField("name");
f1.set(p, "LiuDEHua");
System.out.println(p);
Field f2=clazz.getDeclaredField("age");
f2.setAccessible(true);
f2.set(p, 20);
System.out.println(p);
//Method
Method m1=clazz.getMethod("show");
m1.invoke(p);
Method m2=clazz.getMethod("display",String.class);
m2.invoke(p,"CHN");
}
//在有反射以前
//@Test
public void test1() {
Person p=new Person();
p.setAge(10);
p.setName("Tony");
System.out.println(p);
p.show();
p.display("HK");
}
}
运行结果
源代码
链接:https://pan.baidu.com/s/1Ra5PaU8kSC_NH_D00GeBVw
提取码:36c8