版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31063463/article/details/80053936
什么是反射
在运行状态中,任何类都可以获取其属性和方法,可以调用其任意方法的属性
Class类
在class文件被加载到内存中时,内存中生成一个与class对应的Class类;class文件所有的信息与结构包含在Class类中
静态加载和动态加载
静态加载:编译时加载,new 关键字实例化对象
动态加载:运行时加载,class.newInstance() 实例化对象
获取所有字段信息
public class ClassUtil {
private Logger logger = Logger.getLogger(getClass());
// ?表示不确定类型
private Class<?> target;
public ClassUtil(Class<?> target) {
this.target = target;
}
/**
* 获取所有字段(成员变量),名称,类型,类型名
* @return
*/
public void getFields(){
this.logger.info("------------->获取所有字段");
//获取所有的字段,不包括父类继承的字段,getFields()只能获取public修饰的字段
Field[] fields= target.getDeclaredFields();
this.logger.info("-------------->字段数量:"+fields.length);
for (Field item: fields){
System.out.print("类型:"+item.getType().getName()+" 名称:"+item.getName()+"");
System.out.println();
}
}
}
获取对象方法
public class ClassUtil {
private Logger logger = Logger.getLogger(getClass());
// ?表示不确定类型
private Class<?> target;
public ClassUtil(Class<?> target) {
this.target = target;
}
public void getMethods(){
// 获取自己声明的所有方法
Method[] methods= this.target.getDeclaredMethods();
for (Method var1: methods){
// 获取所有参数
Parameter[] parameters= var1.getParameters();
System.out.print(var1.getReturnType().getSimpleName()+" " + var1.getName()+"(");
if (parameters.length!=0){
for (Parameter var2: parameters){
System.out.print(var2.getType().getSimpleName()+",");
}
}
System.out.print(")");
System.out.println();
}
}
}
获取构造函数
public class ClassUtil {
private Logger logger = Logger.getLogger(getClass());
// ?表示不确定类型
private Class<?> target;
public ClassUtil(Class<?> target) {
this.target = target;
}
public void getConstructors(){
Constructor[] cons= this.target.getDeclaredConstructors();
for (Constructor var: cons){
Parameter[] parameters = var.getParameters();
System.out.print(var.getName()+"(");
if(parameters.length!=0){
for (Parameter var1: parameters) {
System.out.print(var1.getType().getSimpleName()+",");
}
}
System.out.print(")");
System.out.println();
}
}
}
通过反射操作方法
public class MainTest {
private final Logger logger = Logger.getLogger(getClass());
private Class<?> cls = null;
@Before
public void before() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
this.cls = Class.forName("club.yuit.entity.Person");
//this.cls.newInstance();
}
@Test
public void methodOperation() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
Method method= cls.getMethod("sayHello",String.class);
//可用Object接收返回值,没有返回值为null,有返回值返回相应的值
method.invoke(cls.newInstance(),"你好");
}
}
获取运行时注解
public class ClassUtil {
private Logger logger = Logger.getLogger(getClass());
// ?表示不确定类型
private Class<?> target;
public ClassUtil(Class<?> target) {
this.target = target;
}
/**
* 获取运行时注解
*/
public void getAnnotations(){
Annotation[] annotations= this.target.getAnnotations();
for (Annotation var1: annotations) {
Class<?> clsType = var1.annotationType();
Method[] methods=clsType.getDeclaredMethods();
for (Method var2: methods){
System.out.print(var2.getReturnType().getSimpleName()+" " +var2.getName()+"(");
Parameter[] parameters = var2.getParameters();
if(parameters.length!=0){
for (Parameter var3: parameters){
System.out.print(var3.getName()+",");
}
}
System.out.print(")");
System.out.println();
}
}
}
}
作为平时的笔记,代码地址github