美文网首页
一文搞定反射基本API

一文搞定反射基本API

作者: 墨线宝 | 来源:发表于2023-11-12 10:32 被阅读0次

反射

Java提供反射来在运行时状态下动态的获取类的属性、方法等信息,在框架中很多地方都应用到了反射

反射的操作

获取Class对象

获取Class对象的四种方式

// 第一种
Class<Person> clazz = Person.class;

// 第二种
Person person = new Person();
Class clazz1 =  person.getClass();

// 第三种
String className = "com.zhanghe.study.reflect.Person";
Class clazz2 = Class.forName(className);

// 第四种 使用类加载器
ClassLoader classLoader = TestClass.class.getClassLoader();
Class clazz3 = classLoader.loadClass(className);

获取构造器

Class clazz = TestConstructor.class;
Constructor[] constructors = clazz.getConstructors();
System.out.println("=========clazz.getConstructors()====只能获取到公有的构造器");
for(Constructor constructor : constructors){
  System.out.println(constructor);
}
System.out.println("*****************");

System.out.println("=========clazz.getConstructor()=====获取公有无参构造器");
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
System.out.println("*****************");

System.out.println("=========clazz.getDeclaredConstructors()=====获取所有构造器(包括私有、受保护、默认、公有)");
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor declaredConstructor : declaredConstructors){
  System.out.println(declaredConstructor);
}
System.out.println("*****************");

System.out.println("=========clazz.getDeclaredConstructor()====获取指定参数类型的构造器");
Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
System.out.println("*****************");

获取属性

System.out.println("======getFields===========");
// 获取所有的属性  只能获取到该类和父类中public的
Field[] fields = clazz.getFields();
for (Field f : fields){
  System.out.println(f.getName());
}
System.out.println("======getDeclaredFields===========");
// 获取所有的属性  本类中声明的所有的属性都可以获取到,不可以获取到父类的
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields){
  // 获取权限修饰符
  int i = f.getModifiers();
  String m = Modifier.toString(i);
  System.out.println("Modifier:"+m);
  // 获取属性类型
  Class type = f.getType();
  System.out.println("type:"+type.getTypeName());
  // 获取属性名
  System.out.println("name:"+f.getName());
}

获取方法

System.out.println("======getMethods===========");
// 获取本类和父类中所有的public方法
Method[] methods = clazz.getMethods();
for(Method m : methods){
  System.out.println(m.getName());
}

System.out.println("======getDeclaredMethods===========");
// 获取本类中所有的方法,包括私有方法  父类的无法获取
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m : declaredMethods){
  // 获取注解
  Annotation[] annotations = m.getAnnotations();
  // 权限修饰符
  System.out.println("Modifier:"+Modifier.toString(m.getModifiers()));
  // 返回值类型
  Class reture = m.getReturnType();
  // 形参列表
  Class[] params = m.getParameterTypes();
  // 方法名
  System.out.println(m.getName());
  // 异常类型
  Class[] exceptions = m.getExceptionTypes();
}

获取父类信息

// 获取父类
Class superClass = clazz.getSuperclass();

// 获取带泛型的父类
Type superType = clazz.getGenericSuperclass();

// 获取父类的泛型
if(superType instanceof ParameterizedType){ // 如果存在泛型
  Type[] actualTypeArguments = ((ParameterizedType) superType).getActualTypeArguments();
}

获取接口

// 获取实现的接口
Class[] interfaces  = clazz.getInterfaces();

获取包

// 获取所在的包
Package aPackage = clazz.getPackage();

获取注解

// 获取注解
Annotation[] annotations  = clazz.getAnnotations();

反射为属性赋值

// 通过反射创建person实例
Person person = clazz.newInstance();
// 通过反射获取类的age属性,并赋值
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(person,20);

反射执行方法

// 通过反射获取方法,并调用
Method method = clazz.getMethod("display");
method.invoke(person);

https://zhhll.icu/2020/java基础/反射/1.反射/

本文由mdnice多平台发布

相关文章

  • Java-反射基本API

    1,什么是反射? 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。 2...

  • java反射初识

    反射 反射的优缺点 优点 缺点 反射主要的api

  • 反射API

    本文将按如下导图讲述反射的使用 Class对象的获取 方法一: 方法二: 方法三: 一般使用第三种: 不依赖Jav...

  • 反射API

    反射API 前言 在面试中,经常会被问到在Java反射中Class.forName()加载类和使用ClassLoa...

  • Kotlin和Java互相调用(二)

    Kotlin反射 正如在前面不少代码中所见到的, Kotlin也提供了反射 API,这些反射 API可以方便程序在...

  • Java反射机制

    Java反射机制 前言 网页版的jdk的API离线版API 什么是反射机制 反射是java语言的一个特性,它允程序...

  • 一文搞定babel-理解babel的基本原理和使用方法

    一文搞定babel 欢迎关注 理解babel的基本原理和使用方法[https://mp.weixin.qq.com...

  • 收录

    一文搞定MySQL性能调优

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • ES6(十二)—— Reflect

    Reflect 反射,什么是反射机制? Reflect简介 为什么要用Reflect? Reflect API.a...

网友评论

      本文标题:一文搞定反射基本API

      本文链接:https://www.haomeiwen.com/subject/haglwdtx.html