回顾java反射
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java的反射机制。
反射机制指的是程序找运行时能够获取自身的信息。
package com.atguigu.reflect;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestCar {
//1、获取Class对象的多种方式
@Test
public void test1() throws Exception{
//1、类名.class
Class clazz1 = Car.class;
//2、对象.getClass()
Class clazz2 = new Car().getClass();
//3、Class.forName("全路径")
Class clazz3 = Class.forName("com.atguigu.reflect.Car");
System.out.println(clazz1);
System.out.println(clazz2);
System.out.println(clazz3);
//实例化
Car car = (Car)clazz3.getDeclaredConstructor().newInstance();
System.out.println(car);
}
//2、获取构造方法
@Test
public void test2() throws Exception {
Class clazz = Car.class;
//得到所有public修饰的构造方法
//Constructor[] constructors = clazz.getConstructors();
//获取所有的构造方法
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor c: constructors){
System.out.println(c.getName()+c.getParameterCount());
}
//指定有参数构造创建对象
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
constructor.setAccessible(true);//表示可以访问私有的
Car car = (Car) constructor.newInstance("夏利", 10, "蓝色");
System.out.println(car);
}
//3、获取属性
@Test
public void test3() throws Exception{
Class clazz = Car.class;
Car car = (Car)clazz.getDeclaredConstructor().newInstance();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
if(field.getName().equals("name")){
field.setAccessible(true);
field.set(car,"五菱宏光");
}
System.out.println(car);
System.out.println(field.getName());
}
}
//4、获取方法
@Test
public void test4() throws Exception{
Car car = new Car("奔驰",10,"黑色");
Class clazz = car.getClass();
Method[] methods = clazz.getMethods();
for(Method method :methods){
//System.out.println(method.getName());
if(method.getName().equals("toString")){
String in = (String)method.invoke(car);
System.out.println("toString执行了"+in);
}
}
System.out.println("----------------------------");
Method[] methods1 = clazz.getDeclaredMethods();
for(Method method :methods1){
// System.out.println(method.getName());
if(method.getName().equals("run")){
method.setAccessible(true);
method.invoke(car);
}
}
}
}