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

Java反射

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

Java反射

目录
  • 概述
      • 什么是反射
      • 优点
  • Class类
      • 获得Class对象
      • 反射创建对象
      • 获取构造方法
      • 获取成员变量
      • 获取成员方法

概述 什么是反射

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

反射就是把java类中各个成分映射成一个个java对象

​ 例如一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象

优点

​ 可以只写一套代码,就可以获得任意类的信息,并创建其对象

Class类
  • 一旦class文件被加载到内存,就会为其创建一个Class对象。任何类被使用时都会创建一个Class对象
  • Class类是Java反射机制的基础,通过Class类,可以得到一个类的基本信息

获得Class对象
public class Text {
    public static void main(String[] args) throws ClassNotFoundException {
        

        //方式1:通过其class属性获取,任何数据类型(包括基本数据类型)都有一个“静态”的class属性
        Class c1 = Car.class;
        System.out.println(c1);

        //方式2:Object类里的getClass(),public final native Class getClass(); native:本地方法(C++),操作系统实现
        Class c2 = new Car().getClass();

        //方式3:Class类的静态方法:forName(),根据类的地址将类的信息加载到内存中,并创建Class对象
        Class c3 = Class.forName("com.ff.dormitoryManage.reflect.Car");
    }
}
反射创建对象
T newInstance() 创建由此 类对象表示的类的新实例。
Car car1 = (Car) c1.newInstance();//创建了Class对象所表示的类的对象
获取构造方法

批量的方法

  1. public Constructor[] getConstructors():所有"公有的"构造方法
  2. public Constructor[] getDeclaredConstructors():获取所有的构造方法

获取单个的方法

  1. public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:
  2. public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Text {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class c = Class.forName("com.ff.dormitoryManage.reflect.Car");


        //获取所有的共有构造方法
        for (Constructor constructor : c.getConstructors()) {
            System.out.println(constructor);
        }

        //获取所有的构造方法
        for (Constructor declaredConstructor : c.getDeclaredConstructors()) {
            System.out.println(declaredConstructor);
        }

        //获取公有无参构造方法
        Constructor constructor = c.getConstructor();

        //获取私有构造方法
        Constructor declaredConstructor = c.getDeclaredConstructor(String.class, String.class);
        //修改权限(忽略访问修饰符)
        declaredConstructor.setAccessible(true);
        //调用构造方法创建对象
        Car car = (Car) declaredConstructor.newInstance("宝马", "红色");
    }
}

获取成员变量

批量的

  1. Field[] getFields():获取所有的"公有字段"
  2. Field[] getDeclaredFields():获取所有字段

单个的

  1. public Field getField(String fieldName):获取某个"公有的"字段;
  2. public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

设置字段的值

Field --> public void set(Object obj,Object value):

参数说明: 1.obj:要设置的字段所在的对象 2.value:要为字段设置的值

package com.ff.dormitoryManage.reflect;

import java.lang.reflect.Field;

public class Text2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        Class c = Class.forName("com.ff.dormitoryManage.reflect.Car");
        Car car = (Car) c.newInstance();
    

        //获取所有共有的属性
        for (Field field : c.getFields()) {
            System.out.println(field);
        }

        //获取所有的属性
        for (Field declaredField : c.getDeclaredFields()) {
            System.out.println(declaredField);
        }

        //获取指定的属性并调用
        Field name = c.getField("name");
        name.set(car, "宝马");
        System.out.println(car);
        Field color = c.getDeclaredField("color");
        color.setAccessible(true);
        color.set(car, "黑色");
        System.out.println(car);
    }
}
获取成员方法

批量的

  1. public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
  2. public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

获取单个

  1. public Method getMethod(String name,Class… parameterTypes):

    参数:name : 方法名; Class … : 形参的Class类型对象

  2. public Method getDeclaredMethod(String name,Class… parameterTypes)

调用方法

Method --> public Object invoke(Object obj,Object… args):

参数说明: obj : 要调用方法的对象; args:调用方式时所传递的实参

package com.ff.dormitoryManage.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class text4 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class c = Class.forName("com.ff.dormitoryManage.reflect.Car");
        Car car = (Car) c.newInstance();



        //获得成员方法
        Method run1 = c.getMethod("run");
        run1.invoke(car);
        Method run2 = c.getMethod("run", int.class);
        run2.invoke(car, 60);

        //获得get/set方法
        Field[] fields = c.getDeclaredFields();
        for (Field f : fields) {
            Method method = c.getMethod("get" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1));
            method.invoke(car);
        }
    }
}

-------------------------------------------------------
公有无参构造方法
汽车跑
汽车以60码的速度跑
getName方法
getColor方法
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348852.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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