一:类的加载
二:class的获取三种获取方法
三:class对象的功能
1:Field
package com.springboot.reflex;
import java.lang.reflect.Field;
/**
* @author: 牧羊
* @Date: 2020/4/4 12:57
*/
public class test {
public static void main(String[] args) throws Exception {
Class clazz = Person.class;
//1:获取指定的public成员变量
Field name = clazz.getField("name");
//2:获取所有的public的成员变量
Field[] fields = clazz.getFields();
for (Field field : fields){
System.out.println(field);
}
System.out.println("--------------------");
//3:获取所有的成员变量
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field :declaredFields){
System.out.println(field);
}
System.out.println("--------------------");
//4:获取指定的成员变量
Field phone = clazz.getDeclaredField("phone");
//暴力反射,忽略修饰符的安全检查
phone.setAccessible(true);
//5:set
Person person = new Person();
phone.set(person,"18797813533");
System.out.println(person);
//6:get
System.out.println(phone.get(person));
}
}
2:构造方法
package com.springboot.reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/**
* @author: 牧羊
* @Date: 2020/4/4 12:57
*/
public class test2 {
public static void main(String[] args) throws Exception {
Class clazz = Person.class;
//1:获取public无参构造方法
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
//2:获取public带参构造方法
Constructor constructor1 = clazz.getConstructor();
System.out.println(constructor1);
//3:获取public所有的构造方法
Constructor[] constructors = clazz.getConstructors();
//4:获取指定的带参数构造方法
Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, Integer.class);
//5:获取所有的构造方法
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
//6:创建对象
Object person = constructor.newInstance();
System.out.println(person);
//暴力反射
declaredConstructor.setAccessible(true);
Object person1 = declaredConstructor.newInstance("zhangsan", 22);
System.out.println(person1);
}
}
3:方法
package com.springboot.reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* @author: 牧羊
* @Date: 2020/4/4 12:57
*/
public class test3 {
public static void main(String[] args) throws Exception {
Class clazz = Person.class;
//1:获取指定的public的不带参数方法
Method eat = clazz.getMethod("eat");
//2获取所有的public方法
Method[] methods = clazz.getMethods();
//3:获取指定的带参数方法
Method eat1 = clazz.getDeclaredMethod("eat", String.class);
//4:获取所有的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
//5:执行方法
Person p = new Person();
eat.invoke(p);
//暴力反射
eat1.setAccessible(true);
eat1.invoke(p,"zhangsan");
//6:获取方法名称
System.out.println(eat1.getName());
//7:获取类名
System.out.println(clazz.getName());
System.out.println(clazz.getSimpleName());
}
}
四:案例
package com.springboot.reflex;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* @author: 牧羊
* @Date: 2020/4/4 12:57
*/
public class test4 {
public static void main(String[] args) throws Exception {
//1:加载配置文件
//创建Properties对象
Properties properties = new Properties();
//加载class文件下的配置文件
ClassLoader classLoader = Person.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
properties.load(resourceAsStream);
//2:获取配置文件下定义的参数
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//3:加载类进内存
Class<?> clazz = Class.forName(className);
//4:创建对象
Object obj = clazz.newInstance();
//5:获取方法对象
Method method = clazz.getMethod(methodName);
//6:执行方法
method.invoke(obj);
}
}
五:面试题
https://blog.csdn.net/qq_37875585/article/details/89340495