java反射

系列文章目录

第一章 万事万物皆对象
第二章 java构造器
第三章 java访问权限
第四章 java初始化
第五章 java继承
第六章 java重载与重写
第七章 java接口和抽象类
第八章 java数组
第九章 java内部类
第十章 java时间操作
第十一章 final关键字
第十二章 java字符串
第十三章 java异常
第十四章 java泛型
第十五章 java IO操作
第十六章 java NIO操作
第十七章 java zip压缩
第十八章 java反射
第十九章 java反射之Type接口
第二十章 java8流式操作
第二十一章 java8函数式编程



原文链接 https://zhhll.icu/2020/java基础/反射/1.反射/

反射

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);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾光师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值