1.反射定义
反射是一种可以间接操作目标对象的机制。当使用反射时,JVM 在运行的时候才动态加载类,对于任意类,知道其属性和方法,并不需要提前在编译期知道运行的对象是谁,允许运行时的 Java 程序获取类的信息并对其进行操作。
2.获取类的四个方式
3.class从类中获取构造器的方法
请看下面例子:
先创建一个cat类:
package 反射;
public class Cat {
public static int a;
public static final String country = "中国";
private String name;
private int age;
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", 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 run(){
System.out.println("跑得脱马老壳");
}
public Cat(String name, int age) {
System.out.println("有参构造器");
this.name = name;
this.age = age;
}
public Cat() {
System.out.println("无参构造器");
}
}
package 反射;
import jdk.jfr.StackTrace;
import jdk.swing.interop.SwingInterOpUtils;
import org.junit.Test;
public class Constructor {
@Test
public void testGetConstructors() throws ClassNotFoundException {
Class c1 = Class.forName("反射.Cat");
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
//获取类的全部构造器
java.lang.reflect.Constructor[] constructors = c1.getDeclaredConstructors();
for (java.lang.reflect.Constructor constructor : constructors) {
System.out.println(constructor.getName() + "-->"+constructor.getParameterCount());
}
}
@Test
public void testGetConstructor() throws Exception{
Class catClass = Class.forName("反射.Cat");
//获取无参构造器
java.lang.reflect.Constructor constructor = catClass.getConstructor();
System.out.println(constructor.getName()+"->"+constructor.getParameterCount());
//获取有参构造器
java.lang.reflect.Constructor declaredConstructor = catClass.getDeclaredConstructor(String.class, int.class);
System.out.println(declaredConstructor.getName()+"->"+declaredConstructor.getParameterCount());
}
}
4.class提供了从类中获取成员变量的4个方法
请看下面代码:
package 反射;
import org.junit.Test;
import java.lang.reflect.Field;
//获取类的成员变量
public class Test2 {
@Test
public void getField() throws NoSuchFieldException, IllegalAccessException {
Class<Cat> catClass = Cat.class;
Field[] fields = catClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName()+"->"+field.getType());
}
//定位成员变量
Field catName = catClass.getDeclaredField("name");
//赋值
Cat cat = new Cat();
catName.setAccessible(true);
catName.set(cat,"加菲猫");
System.out.println(cat);
}
}