栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-24

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-24

学习目标: 掌握反射机制
学习内容: 1、 Java类 2、 反射 3、 反射相关API
学习时间: 1、 2021年10月22日 2、 2021年10月24日
学习产出: 1、 技术笔记 1 遍 回忆:java类

​ 1.设计类

​ 2.创建对象(两种方式)

​ new Car();

​ IO反序列化

​ 3.调用类的方法和属性

反射

java反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能成为java语言的反射机制。

作用:动态获取类的信息,进一步实现需要的功能

反射相关API

Class 类型

Constructor 构造方法

Method 方法

Field 属性

除了Class外,其他类都位于java.lang.reflect包中

反射API将类的类型、方法、属性都封装成了类

Class类

Class类的对象表示正在运行的Java应用程序中的类和接口.

获得Class类的三种方法
		
        Class c1 = Car.class;//类名.class方式
        System.out.println(c1);//class com.ffyc.dormMS.reflect.Car

        Class c2 = new Car().getClass();//Object类中的getClass方法
        System.out.println(c2);
        System.out.println(c1==c2);//true

        String carpath = "com.ffyc.dormMS.reflect.Car";
        Class c3 = Class.forName(carpath);//Class类的静态方法
        System.out.println(c3);
        System.out.println(c2==c3);//true

        Car car = (Car)c1.newInstance();//创建由此 类对象表示的类的新实例。
Constructor类

Constructor类可以通过getXXX方法获得构造方法的基本信息

Constructor实例通过Class实例获得(newInstance())

		String carpath = "com.ffyc.dormMS.reflect.Car";
        Class c3 = Class.forName(carpath);//根据类的地址将类信息加载到内存中,并创建类的Class对象

        

        
		
        
        //Constructor类可以通过getXXX方法获得构造方法的基本信息
        Constructor[] cons = c3.getDeclaredConstructors();//返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组类
        for (Constructor con : cons){
            System.out.println(con.getName());
            System.out.println(con.getParameterCount());
            System.out.println(con.getParameterTypes());
        }
Field类

Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值

获得Field实例,都是通过Class中的方法实现

		
        String carpath = "com.ffyc.dormMS.reflect.Car";
        Class c3 = Class.forName(carpath);//Class类的静态方法
        Car car = (Car)c3.newInstance();

        

        //返回一个 Field对象,它反映此表示的类或接口的所有属性的类对象
        Field[] fs =   c3.getDeclaredFields();

        for (Field f : fs){
            f.setAccessible(true);
            if(f.getName().equals("name")){
                f.set(car,"宝马");
            }
            if(f.getName().equals("color")){
                f.set(car,"黑色");
            }
        }
Method类

Method类将类中的方法进行封装,可以动态获得方法的信息

​ getName:获得方法名字

​ getParameterTypes:获得方法参数类型,把参数封装到一个对象中去

除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法

​ invoke(Object obj, Object… args) :使用obj调用该方法,参数

为args

Method实例都是通过Class类的方法获得

​ Method getMethod(String name, Class… parameterTypes) :通过指定方法名,参数类型,返回一个 Method实例

		String carpath = "com.ffyc.dormMS.reflect.Car";
        Class c = Class.forName(carpath);//Class类的静态方法
        Car car = (Car)c.newInstance();

        

        Field[] fs = c.getFields();
        for (Field f : fs){
            Method m4 = c.getMethod("get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1));
            System.out.println(m4.getName());
         System.out.println(m4.getTypeParameters());
            m4.invoke(car);
        }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346117.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号