一.一些基本的类
1.0 UP自己画的图

1.1Modifier类解析访问修饰符
1.1.1Modifier可以干什么
java.lang.reflect.Modifier 是 JDK 提供的反射工具类 ,专门用于解析、判断、拼接 Java 类 / 方法 / 字段 / 构造器的访问修饰符(如 public、static、final)和修饰符标识,是反射开发中处理修饰符的核心工具。
1.1.2构造器私有


1.1.3常见的修饰符对应的常量


1.1.4判断是否是某个修饰符 boolean .isXXX()



1.1.5.toString()方法


1.1.6拼接字符串 - 按 | 运算,把对应的位复合起来

1.2 Field类 - 获取类的成员变量
1.2.1 Field可以干什么
一个Field对象就代表类中一个字段(static/实例/public/private等都可以)
通过 Field,你可以在运行时动态做到:
- 获取字段名、类型、修饰符
- 获取 / 修改字段的值(即使是 private)
- 获取字段上的注解
- 判断字段是静态还是实例变量
1.2.2Field类的方法

1.2.3Field类获取字段类型


coding
@Test
public void testGetSingleField() throws NoSuchFieldException {
Class<User> clazz = User.class;
Field field = clazz.getDeclaredField("username");
System.out.println("字段名:" + field.getName());
System.out.println("字段类型:" + field.getType());
System.out.println("字段修饰符:" + Modifier.toString(field.getModifiers()));
}
1.2.4Field类获取Modifier类来查看字段修饰符


coding
@Test
public void testGetSingleField() throws NoSuchFieldException {
Class<User> clazz = User.class;
Field field = clazz.getDeclaredField("username");
System.out.println("字段名:" + field.getName());
System.out.println("字段类型:" + field.getType());
System.out.println("字段修饰符:" + Modifier.toString(field.getModifiers()));
}
1.3Constructor类
1.3.1Constructor类的方法
// c.getConstructor(...) 获取一个公共的构造器
// c.getDeclaredConstructor(...) 获取一个本类声明的构造器,可以是非公共的
// c.getConstructors() 获取所有公共的构造器
// c.getDeclaredConstructors() 获取所有本类声明的构造器
1.3.2获取全部的Constructor构造器

coding
@Test
public void testGetAllPublicConstructors() throws NoSuchMethodException {
// c.getConstructor(...) 获取一个公共的构造器
// c.getDeclaredConstructor(...) 获取一个本类声明的构造器,可以是非公共的
// c.getConstructors() 获取所有公共的构造器
// c.getDeclaredConstructors() 获取所有本类声明的构造器
Class clazz = String.class;
System.out.println("String类共有构造器:");
for (Constructor c : clazz.getConstructors()) {
System.out.println(c);
}
}
1.3.3利用Constructor构造对象
@Test
public void testAssignAttribute()throws Exception{
Class<?> clazz = Class.forName("bean.Employee");
//获取无参构造
Constructor<?> noArgConstructor = clazz.getConstructor();
Object obj = noArgConstructor.newInstance();
//System.out.println(obj);
/*//获取有参构造
Constructor<?> constructor = clazz.getConstructor(String.class,int.class,double.class);
//利用有参构造创建对象
Object obj = constructor.newInstance("Tom",18,5000);*/
/*//获取属性的类型和名称
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields){
System.out.println(field.getType() + " "+ field.getName());
}*/
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);//因为姓名是私有属性,所以为了访问,先设置可访问性为true
nameField.set(obj,"Tom");
System.out.println(obj);
}

1.4 Method类
1.4.1Method类的方法


1.4.2coding
@Test
public void testShowAllMethod() {
//获取String类的所有方法
// c.getMethod(...) 获取一个公共的方法,包括从父类继承的公共的方法
// c.getDeclaredMethod(...) 获取一个本类声明的方法,可能是非公共的
// c.getMethods() 获取所有公共的方法,包括从父类继承的公共的方法
// c.getDeclaredMethods() 获取所有本类声明的方法,可能是非公共的
Method[] declaredMethods = String.class.getDeclaredMethods();
System.out.println("String类的所有方法:");
for (Method method : declaredMethods) {
System.out.println(method);
}
}
1.4.3通过Class+Constuctor+Method操作方法
package reflect;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testOperateMethod {
@Test
public void testOperateMethod() throws Exception {
Class<?> rect = Class.forName("bean.Rectangle");
Constructor<?> constructor = rect.getConstructor();
Object obj = constructor.newInstance();
Field lengthField = rect.getDeclaredField("length");
Field widthField = rect.getDeclaredField("width");
lengthField.setAccessible(true);
widthField.setAccessible(true);
lengthField.set(obj, 10);
widthField.set(obj, 5);
System.out.println(obj);
Method getAreaMethod = rect.getMethod("area");
System.out.println(getAreaMethod.invoke(obj));
Method perimeterMethod = rect.getMethod("perimeter");
System.out.println(perimeterMethod.invoke(obj));
}
}
