反射常用对象概述
- Class
Class类的实例表示正在运行的Java应用程序中的类和接口 - Constructor
关于类的单个构造方法的信息以及对它的访问权限 - Field
Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。(类中的属性) -
Method
Method提供关于类或接口上单独的方法信息。(类中的方法)
图片.png
Class类
图片.pngpackage com.alan.reflect;
import com.alan.entity.Person;
import org.junit.Test;
public class ClassTest {
@Test
/**
* 获得Class对象
* 1、类名.class
* 2、对象.getClass()
* 3、Class.forName()
*/
public void demo1() throws ClassNotFoundException {
//1、类名.class
Class<Person> class1 = Person.class;
//2、对象.getClass()
Person person = new Person();
Class<? extends Person> class2 = person.getClass();
//3、Class.forName() 通常采用这种方式获得
Class<?> class3 = Class.forName("com.alan.entity.Person");
}
}
Constructor类
图片.pngpackage com.alan.reflect;
import com.alan.entity.Person;
import org.junit.Test;
import java.lang.reflect.Constructor;
/**
* 获得Constructor对象
*/
public class ConstructorTest {
@Test
/**
* 获得无参构造
*/
public void demo1() throws Exception {
//获得类的字节码文件对应的对象
Class class1 = Class.forName("com.alan.entity.Person");
//获得无参构造方法
Constructor constructor = class1.getConstructor();
//通过构造器来实例化一个对象
Person person = (Person) constructor.newInstance(); //相当于 Person person = new Person();
person.eat();
}
@Test
/**
* 获得有参构造,并实例化
*/
public void demo2() throws Exception{
//获得类的字节码文件对应的对象
Class class1 = Class.forName("com.alan.entity.Person");
//获得有参构造
Constructor constructor = class1.getConstructor(String.class, String.class);
//通过带参构造器实例化对象
Person person = (Person) constructor.newInstance("alan", "male");//相当于 Person person = new Person("alan","male");
System.out.println(person);
}
}
Field类
图片.pngpackage com.alan.reflect;
import com.alan.entity.Person;
import org.junit.Test;
import java.lang.reflect.Field;
public class FiledTest {
@Test
/**
* 测试公有属性,一般没有必要反射,直接可以通过对象获取
*/
public void demo() throws Exception {
//获得类字节码文件对应的对象
Class<?> class1 = Class.forName("com.alan.entity.Person");
//获得属性值
Field name = class1.getField("name");
//操作属性,JDK9以后建议使用新方法class1.getDeclaredConstructor().newInstance()
Person person = (Person) class1.getDeclaredConstructor().newInstance();
name.set(person,"你好啊"); //相当于 person.name = "你好啊"
System.out.println(name.get(person));
}
@Test
/**
* 测试私有属性
*/
public void demo2() throws Exception {
//获得类字节码文件对应的对象
Class class1 = Class.forName("com.alan.entity.Person");
//获得属性值
Field name = class1.getDeclaredField("name");
//给私有属性赋值
Person person = (Person) class1.getDeclaredConstructor().newInstance();
//设置私有属性可访问权限
name.setAccessible(true);
name.set(person,"小二郎");
//打印输出
System.out.println(name.get(person));
}
}
Method类
图片.pngpackage com.alan.reflect;
import com.alan.entity.Person;
import org.junit.Test;
import java.lang.reflect.Method;
public class MethodTest {
@Test
/**
* 测试公有方法
*/
public void demo1() throws Exception {
Class<?> class1 = Class.forName("com.alan.entity.Person");
//实例化
Person person = (Person) class1.getDeclaredConstructor().newInstance();
//获得公有方法
Method method = class1.getMethod("eat");
//执行方法
method.invoke(person); //相当于person.eat();
}
@Test
/**
* 测试私有方法
*/
public void demo2() throws Exception {
Class<?> class1 = Class.forName("com.alan.entity.Person");
//实例化
Person person = (Person) class1.getDeclaredConstructor().newInstance();
//获得私有方法
Method method = class1.getDeclaredMethod("run");
//设置私有方法访问权限
method.setAccessible(true);
//执行方法
method.invoke(person);
}
@Test
/**
* 测试带参私有方法
*/
public void demo3() throws Exception {
Class<?> class1 = Class.forName("com.alan.entity.Person");
//实例化
Person person = (Person) class1.getDeclaredConstructor().newInstance();
//获得私有方法
Method method = class1.getDeclaredMethod("sayHello", String.class);
//设置私有方法访问权限
method.setAccessible(true);
//执行方法
String str = (String) method.invoke(person, "小鄂鄂");
System.out.println(str);
}
}
网友评论