反射是指在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能调用他的任意一个方法和属性,这种动态获取以及调用对象的方法功能,成为java语言的反射机制。
创建Person类
package com.etc.tes;
public class Person {
private int id;
private String name;
private String address;
public Person(String name,String address){
this.address=address;
this.name=name;
}
public Person(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void hello(){
System.out.println("Hello World.....");
}
}
创建测试类
package com.etc.tes;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
//根据类的绝对路径,获取Class对象
Class<?> class1 = Class.forName("com.etc.tes.Person");
//反射实例化对象
Object object = class1.newInstance();
//获得构造方法
Constructor<?> constructor = class1.getConstructor(String.class,String.class);
//为构造方法传参数,获取对象
Object object2 = constructor.newInstance("马云","杭州");
Person person = (Person)object2;
System.out.println(person.getName()+"-"+person.getAddress());
//获得Method方法,调用invoke对象的hello方法
Method method = class1.getMethod("hello");
method.invoke(object2);
//通过获取的Object为对象属性赋值
Field address = class1.getDeclaredField("address");
Field name = class1.getDeclaredField("name");
address.setAccessible(true);//解除封装
address.set(object, "深圳");
name.setAccessible(true);
name.set(object, "马化腾");
Person person2 = (Person)object;
System.out.println(person2.getName()+"-"+person2.getAddress());
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果
马云-杭州
Hello World.....
马化腾-深圳