首页 > 编程语言 >Spring16 - 回顾 Java反射 reflect

Spring16 - 回顾 Java反射 reflect

时间:2023-02-06 17:22:58浏览次数:40  
标签:Java String 获取 Car Spring16 clazz reflect class Class

回顾Java反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。

要想解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关API(1)java.lang.Class(2)java.lang.reflect,所以,Class对象是反射的根源

获取 Class对象,通过 Class对象完成实例化

  • 1 类名.class

  • Class clazz = Car.class;
    
  • 2 对象.getClass()

  • Class clazz = new Car().getClass();
    
  • 3 Class.forName("全路径")

  • Class clazz = Class.forName("com.atguigu.reflect.Car");
    
  • 通过 Class对象进行实例化创建对象

  • Car car = (Car)clazz.getConstructor().newInstance();
    

获取构造方法,通过构造方法完成实例化

  • 1 获取所有构造

  • // getConstructors()获取所有public的构造方法
    Constructor[] constructors = clazz.getConstructors();
    // getDeclaredConstructors()获取所有的构造方法public  private
    Constructor[] constructors = clazz.getDeclaredConstructors();
    
  • 2 指定有参数构造创建对象

  • //1 构造public
    Constructor c1 = clazz.getConstructor(String.class, int.class, String.class);
    Car car1 = (Car)c1.newInstance("夏利", 10, "红色");
    
    //2 构造private
    Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
    //设置允许访问
    c2.setAccessible(true);
    Car car2 = (Car)c2.newInstance("捷达", 15, "白色");
    

获取属性

  • 1 获取所有public属性

  • Field[] fields = clazz.getFields();
    
  • 2 获取所有属性(包含私有属性)

  • Field[] fields = clazz.getDeclaredFields();
    
  • 遍历所有属性,对属性进行操作

  • for (Field field:fields) {
        if(field.getName().equals("name")) {
            //设置允许访问
            field.setAccessible(true);
            field.set(car,"五菱宏光");
            System.out.println(car);
        }
        System.out.println(field.getName());
    }
    

获取方法,通过 invoke 调用方法

  • 1 public方法

  • Method[] methods = clazz.getMethods();
    for (Method m1:methods) {
        System.out.println(m1.getName());
        
        //执行指定方法 比如,toString
        if(m1.getName().equals("toString")) {
            String invoke = (String)m1.invoke(car);
            System.out.println("toString执行了:"+invoke);
        }
    }
    
  • 2 private方法

  • Method[] methodsAll = clazz.getDeclaredMethods();
    for (Method m:methodsAll) {
        //执行指定方法 比如,run
        //需要先设置允许访问 .setAccessible(true)
        if(m.getName().equals("run")) {
            m.setAccessible(true);
            m.invoke(car);
        }
    }
    

标签:Java,String,获取,Car,Spring16,clazz,reflect,class,Class
From: https://www.cnblogs.com/Ashen-/p/17096023.html

相关文章

  • Java Date与时间戳的转换问题
    Java中String与Date格式之间的转换-NemoWang-博客园(cnblogs.com)主要是String类型的时间,需要使用DateFormat来进行设置转换的格式,调用fmt的parse方法进行将时间转为......
  • JAVA中的时区设置问题
    通过对日常环境和生产环境进行对比发现,变更时间传参之后,在后端java程序转换的日期不统一,对查询造成影响。JAVA中的时区设置第一种方式、通过代码指定。finalTimeZonet......
  • Java中数组的使用
    Java中数组的使用介绍Java中数组的基本使用及需要注意的细节,对Java虚拟机的内存划分及数组在内存中的存储进行分析。Author:MsuenbDate:2023-02-06数组的概念数......
  • Javascript(es2016) import和require用法和区别
    写个简单js文件,假设名字为:lib.js。假设内容如下:exportconstsqrt=Math.sqrt;exportfunctionsquare(x){returnx*x;}exportfunctiond......
  • [JavaScript]eval
    eval()eval() 函数会将传入的字符串当做JavaScript代码进行执行。参数string一个表示JavaScript表达式、语句或一系列语句的字符串。表达式可以包含变量与已存......
  • Java8中匹配两个list的数据(string的list与对象list的属性求差集)
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657上面介绍常用api的使用,下面记录一个常用场景的......
  • Java 日期类 处理
    原始方案:SimpleDateFormatsdf=newSimpleDateFormat("YYYY-MM-DD");//线程不安全类,最好不要用了,替代方案:DateTimeFormatterdtf=DateTimeFormatter.ofPattern("YY......
  • [JavaScript]变量提升
    什么是变量提升?简单来说,就是JavaScript在执行程序时,会先把变量声明这一操作提前。换句话来说,就是不会在程序执行过程中声明变量。例子:functionfn(){console.log(nam......
  • java8 list取出重复值
    @Testpublicvoidtest10(){//根据device_code去重,取出重复值List<Employee>emps=newArrayList<>();List<String>dupList=emps.stream().colle......
  • java8 两个相同list去重,过滤相同元素
    @Testpublicvoidtest12(){//需要过滤的集合List<Employee>first=Arrays.asList(newEmployee(102,"李四",79,6666.66,Status.BUSY),......