控制你的大脑,
控制你的行为,你会得到更多,收获很多。
一、反射相关的主要API:
API 名称 |
代表含义 |
Java.lang.class |
代表一个类 |
java.lang.reflect.Method |
代表类的方法 |
java.lang.reflect.Field |
代表类的成员变量 |
java.lang.reflect.Constructor |
代表类的构造器 |
二 、代码例子演示:
1、创建了一个Person类
public class Person implements Serializable {
private static final long serializableVersionUID =4567892L; // 序列版本号
private String name;
int age;
private String sex;
private String nation;
public Person() {
}
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = 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 void show(){
System.out.println(“我要好好学习Java”);
}
private void shownation(String nation){
System.out.println(“我的国籍是:”+nation);
}
@Override
public String toString() {
return “Person{” +
“name=’” + name + ‘’’ +
“, age=” + age +
“, sex=’” + sex + ‘’’ +
‘}’;
}
}
三、反射测试类:
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethondTest {
private Object obj;
反射之前的方法使用
@Test
public void test1(){
Person p = new Person(“jimmy”,12,“男”);
p.setAge(1);
System.out.println§;
p.show();
}
/**
*
* 反射之后 的使用方法
*/
@Test
public void test2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//1、通过反射,创建Person 类的对象
Class clazz = Person.class;
Constructor cons = clazz.getConstructor(String.class, int.class, String.class);
Object o = cons.newInstance("tom", 12, "男");
Person p = (Person) o;
System.out.println(p.toString()); //虚拟方法调用
// System.out.println(o.toString());
// 2、通过反射,调用对象指定的属性、方法
Field age = clazz.getDeclaredField("age");
age.set(p,10);
/**
* 因为我的person 类中age是private 的,改为public 的可以解决
*
* 报错信息:
* java.lang.IllegalAccessException: Class Com.bigDataWork_intentjava.MethondTest can not access a member of class Com.bigDataWork_intentjava.Person with modifiers "private"
*
* at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
*/
System.out.println(p.toString());
//调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);
// 调用Person 类中name属性并且修改。
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p,"zqq");
System.out.println(p);
// 调用Person 类中 私有的方法
Method shownation = clazz.getDeclaredMethod("shownation", String.class);
shownation.setAccessible(true);
shownation.invoke(p,"中国");
}
// @Test
// public void Test(){
// Class clazz = Person.class;
// //getMethods() :获取当前运行时类为public 权限的方法
// Method[] methods = clazz.getMethods();
// for (Method m: methods ){
// System.out.println(m);
// }
// }
}