反射机制,就是提前将类的各个属性方法提取出来,在我们编写源码时,提供参考
public class ParentClass {
public int id;
}
public class MyClass extends ParentClass{
private String value;
public MyClass(){};
public MyClass(String value){
this.value = value;
}
public String getValue(){
return value;
}
public void setValue(String value){
this.value = value;
}
}
package com.peko.tproject;
import com.peko.tproject.entity.MyClass;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* @author Peko
*/
public class Test05 {
@Test
public void test(){
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7);
Optional<Integer> first = numbers.stream()
.map(x -> x*x)
.filter(x -> x%3 == 0)
.findFirst();
if(first.isPresent()){
System.out.println(first.get());
}else{
System.out.println("该数组不存在平方被3整除的数");
}
}
/**
* 【类对象】
* 获取类对象3种方法,这3种方法获取的类对象都是同一个,因为类对象在程序运行时只会被加载一次
* @throws ClassNotFoundException
*/
@Test
public void getMyClass() throws ClassNotFoundException {
//1、通过全类名获取
Class<?> clazz1 = Class.forName("com.peko.tproject.entity.MyClass");
//2、通过类名获取
Class<?> clazz2 = MyClass.class;
//3、通过对象获取
MyClass myClass = new MyClass();
Class<?> clazz3 = myClass.getClass();
//【获取类名】
String clazzName = clazz1.getName();
}
/**
* 【类对象的变量】
* @throws NoSuchFieldException,IllegalAccessException,InstantiationException
*/
@Test
public void myClassField() throws NoSuchFieldException, IllegalAccessException, InstantiationException {
Class<?> clazz = MyClass.class;
//【获取成员变量】
//1、getFields()获取 public 修饰的字段,包括父类public修饰的字段
Field[] fields1 = clazz.getFields();
Field field1 = clazz.getField("id");
//2、获取所有访问权限的字段,不包括父类的字段
Field[] fields2 = clazz.getDeclaredFields();
Field field2 = clazz.getDeclaredField("value");
//【Field的操作】
//获取实例
Object myClass = clazz.newInstance();
//set 赋值
field2.set(myClass,"给属性 value 赋值");
//get 取值
//取值操作前需要 忽略访问权限修饰符的安全检查
field2.setAccessible(true);
Object value = field2.get(myClass);
System.out.println(value.toString());
}
/**
* 【类对象的构造方法】
* @throws NoSuchMethodException
*/
@Test
public void myClassConstructor() throws NoSuchMethodException {
Class<?> clazz = MyClass.class;
//【获取构造方法】
//1、getConstructors()获取 public 修饰的构造方法
Constructor<?>[] constructors1 = clazz.getConstructors();
//获取无参构造
Constructor<?> constructor1_1 = clazz.getConstructor();
//获取有参构造
Constructor<?> constructor1_2 = clazz.getConstructor(String.class);
//2、getDeclaredConstructors()获取所有访问权限的构造方法
Constructor<?>[] constructors2 = clazz.getDeclaredConstructors();
//获取无参构造
Constructor<?> constructor2_1 = clazz.getDeclaredConstructor();
//获取有参构造
Constructor<?> constructor2_2 = clazz.getDeclaredConstructor(String.class);
}
/**
* 【类对象的成员方法】
* @throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException
*/
@Test
public void myClassFunction() throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class<?> clazz = MyClass.class;
//【获取成员方法】
//1、getMethods()获取 public 修饰的成员方法,包括父类、接口 public 修饰的成员方法
Method[] methods1 = clazz.getMethods();
Method method1 = clazz.getMethod("getValue");
//2、getDeclaredMethods()获取所有访问权限的成员方法
Method[] methods2 = clazz.getDeclaredMethods();
Method method2 = clazz.getDeclaredMethod("getValue");
//获取实例
Object myClass = clazz.newInstance();
//【获取方法名称】
String name = method2.getName();
//【执行方法】
method2.invoke(myClass);
}
}