Java基础之—反射(三)

举报
brucexiaogui 发表于 2021/12/29 23:44:51 2021/12/29
【摘要】 Java基础之—反射(三) 一、概述 介绍Class类属性获得类的构造器、方法、属性、注解 二、反射获取类的构造器 import java.lang.reflect.Constructor; class Employee{ private String name; private int age; private Emplo...

Java基础之—反射(三)

一、概述

介绍Class类属性获得类的构造器、方法、属性、注解

二、反射获取类的构造器


  
  1. import java.lang.reflect.Constructor;
  2. class Employee{
  3. private String name;
  4. private int age;
  5. private Employee() {
  6. }
  7. Employee(String name) {
  8. }
  9. public Employee(String name,Integer age) {
  10. }
  11. }
  12. public class ConstructorDemo {
  13. public static void main(String[] args) throws Exception {
  14. //得到Employee的所有的构造器
  15. Class<Employee> clz = Employee.class;
  16. //类的所有公共构造方法
  17. Constructor<Employee>[] cs = (Constructor<Employee>[]) clz.getConstructors();
  18. for (Constructor<Employee> c : cs) {
  19. System.out.println(c);
  20. }
  21. //得到public指定的构造器
  22. //Employee(String name,int age)
  23. //Constructor<Employee> con=clz.getConstructor(String.class,int.class);
  24. //Employee(String name,Integer age)
  25. Constructor<Employee> con=clz.getConstructor(String.class,Integer.class);
  26. System.out.println(con);
  27. //===========================================
  28. /**
  29. * 访问不受访问权限控制:
  30. * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
  31. 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
  32. Constructor<?>[] getDeclaredConstructors()
  33. */
  34. cs = (Constructor<Employee>[]) clz.getDeclaredConstructors();
  35. for (Constructor<Employee> c : cs) {
  36. System.out.println("-->"+c);
  37. }
  38. con = clz.getDeclaredConstructor();//无参
  39. System.out.println(con);
  40. }
  41. }

三、反射获取类的方法


  
  1. import java.lang.reflect.Method;
  2. public class MethodDemo {
  3. void show(){}
  4. public void say(){}
  5. public static void main(String[] args) throws Exception {
  6. Class<MethodDemo> clz = MethodDemo.class;
  7. //拿到子类及其父类里所有的public修饰的方法
  8. Method[] ms = clz.getMethods();
  9. for (Method m : ms) {
  10. System.out.println(m);
  11. }
  12. //拿到子类及其父类里所有的public修饰的指定的方法
  13. Method m = clz.getMethod("main", String[].class);
  14. System.out.println(m);
  15. //=============================================
  16. System.out.println("==================================");
  17. //获取自己类里的所有方法或指定的一个方法,和访问权限无关
  18. ms = clz.getDeclaredMethods();
  19. for (Method method : ms) {
  20. System.out.println(method);
  21. }
  22. m = clz.getDeclaredMethod("show");
  23. System.out.println(m);
  24. //===================================
  25. m = clz.getMethod("toString");
  26. System.out.println(m);
  27. //Exception in thread "main" java.lang.NoSuchMethodException: base.MethodDemo.toString()
  28. m = clz.getDeclaredMethod("toString");
  29. System.out.println("-->"+m);
  30. }
  31. }

四、反射获取类的字段


  
  1. import java.lang.reflect.Field;
  2. class A{
  3. protected String name;
  4. private int age;
  5. public char c;
  6. }
  7. public class FieldDemo extends A {
  8. private String hahha;
  9. public boolean s;
  10. public static void main(String[] args) throws Exception {
  11. Class<FieldDemo> clz = FieldDemo.class;
  12. //获得所有的public 字段,包括继承
  13. Field[] fs = clz.getFields();
  14. for (Field field : fs) {
  15. System.out.println(field);
  16. }
  17. //指定的一个 public的,包阔继承
  18. Field f = clz.getField("c");
  19. System.out.println(f);
  20. //得到所有的字段,只能获取当期类里面的,和访问权限无关
  21. fs = clz.getDeclaredFields();
  22. for (Field field : fs) {
  23. System.out.println("-->"+field);
  24. }
  25. //获得当前类指定一个字段,和访问权限无关
  26. f = clz.getDeclaredField("hahha");
  27. System.out.println(f);
  28. }
  29. }

五、反射获取类的注解


  
  1. import java.lang.annotation.Annotation;
  2. import java.lang.annotation.Inherited;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. @Inherited//可继承的
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @interface Tag{
  8. }
  9. @Tag
  10. class Super1{
  11. }
  12. @Deprecated
  13. @SuppressWarnings("all")
  14. public class AnonationDemo extends Super1{
  15. public static void main(String[] args) {
  16. Class<AnonationDemo> clz = AnonationDemo.class;
  17. //所有的标签,但是是RUNTIME类型,可以获取继承过来的
  18. Annotation[] as = clz.getAnnotations();
  19. System.out.println(as.length);
  20. for (Annotation a : as) {
  21. System.out.println(a);
  22. }
  23. //<A extends Annotation> A getAnnotation(Class<A> annotationClass)
  24. //获得类上时候有执行的Annotation标准
  25. Deprecated d = clz.getAnnotation(Deprecated.class);
  26. // Annotation[] getDeclaredAnnotations() 返回直接存在于此元素上的所有注释不包括继承的。
  27. System.out.println(clz.getDeclaredAnnotations().length);
  28. //表示 某个类上是有有annotationClass标签标注
  29. // boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
  30. //包括继承的
  31. boolean b = clz.isAnnotationPresent(Tag.class);
  32. System.out.println(b);
  33. if(b){
  34. clz.getAnnotation(Tag.class);
  35. }
  36. }
  37. }

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/95516288

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。