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 test01() 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");
//实例化
Car car = (Car)clazz3.getDeclaredConstructor().newInstance();
System.out.println(car);
}
//2、获取构造方法
@Test
public void test02() throws Exception{
Class clazz = Car.class;
//获取所有构造
//getConstructors() 获取所有public的构造方法 无法获得private
//getDeclaredConstructors() 获取所有的构造方法
Constructor[] constructor = clazz.getConstructors();
for (Constructor s: constructor) {
System.out.println("方法名称"+s.getName()+"参数个数"+s.getParameterCount());
}
//指定有参数构造创建对象
//1、构造public
Constructor c1 = clazz.getConstructor(String.class, int.class, String.class);
Car car1 = (Car)c1.newInstance("夏利", 10, "红色"); //通过得到构造器也能实例化出对象
System.out.println(car1);
//2 构造private
Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
c2.setAccessible(true); //构造private时,必须设置此参数后才可正常使用
Car car2 = (Car)c1.newInstance("夏利", 10, "红色"); //通过得到构造器也能实例化出对象
System.out.println(car2);
}
//3、获取属性
@Test
public void test03() throws Exception{
Class clazz = Car.class;
Car car = (Car)clazz.getDeclaredConstructor().newInstance();
//获取所有public属性
// Field[] fields = clazz.getFields();
//获取所有属性(包含私有属性)
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
if(field.getName().equals("name")){
//设置允许访问
field.setAccessible(true);
//传入值时,要配合实例化的对象
field.set(car,"五零火锅");
}
System.out.println(car);
}
}
//4、获取方法
@Test
public void test04() throws Exception{
Car car = new Car("奔驰", 10, "黑色");
Class clazz= car.getClass();
//1 public方法
Method[] methods = clazz.getMethods();
for(Method m1 : methods){
//执行类中的某一个方法
if(m1.getName().equals("toString")){
String invoke = (String)m1.invoke(car);
System.out.println("toString执行了:" + invoke);
}
}
//2 private 方法 与public都差不多,只是需要一个Declared 并且要允许设为true
}
}
``
05-31
1355
01-22
304