【java基础】java的反射机制

1.简介

        java的反射机制是java的特性之一,反射技术是构建框架技术的基础所在。

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

       基础知识补充:要想java程序能够运行,java类必须被java虚拟机加载。运行的程序都是在编译时就已经加载了所需要的类。java反射机制在编译时并不确定是哪个类被加载了,而是在程序运行时才加载,探知,使用。

      java反射机制能够知道类的基本结构,这种对java类结构探知的能力,称为java类的“自审”。

2.作用

     通过java反射,可以实现以下功能:

      在运行时判断任意一个对象所属的类;    在运行时构造任意一个类的对象 ;    在运行时判断任意一个类所具有的方法和属性;在运行时调用任意一个对象的方法;

3.java中使用反射的基本步骤如下:

                 3.1   导入java.lang.reflect.*

                 3.2  获得需要操作的类的java.lang.Class对象

                 3.3 调用Class的方法获取Field,Method等对象

                 3.4 使用反射API进行操作。

4.  获取Class类对象的方式

               4.1      根据类名   类名.class 

               4.2      根据对象    对象.getClass()

               4.3     根据全限定类名  Class.forName(全限定类名)

5. 由Class对象来生成对象实例

               5.1    使用Class对象的newInstance()方法来创建Class对象对应类的实例

               5.2    先通过Class对象获取指定的Constructor对象,再调用Constructor对象的            newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例

6. 由Class对象获取方法

     6.1  getDeclaredMethods 方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法

              6.2  getMethods 方法返回某个类的所有公用(public)方法,包括其继承类的公用方法

              6.3  getMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象

7. 获取类的成员变量信息

     getFiled:访问公有的成员变量

     getDeclaredField:所有已声明的成员变量,但不能得到其父类的成员变量

8.注意

             不能乱用反射,反射创建对象性能要低一些。

             实际上,只有当程序需要动态创建某个类的对象时才考虑使用反射,例如通用性比较广的框架,因为很多java框架需要根据配置文件信息来创建java对象,从配置文件读取的只是某个类的字符串类名,程序要根据字符串来创建对应的实例,就必须使用反射。

package com.fang.search.service.reflect;

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

public class InvokeTest {

    private String name;

    public int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public InvokeTest(){}

    public InvokeTest(String name) {
        this.name = name;
    }

    public int add(int param1, int param2) {
        return param1 + param2;
    }

    public String echo(String message) {
        return "Hello: " + message;
    }

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 原始方法
        InvokeTest invokeTest = new InvokeTest();
        System.out.println(invokeTest.add(1, 2));
        System.out.println(invokeTest.echo("北京"));
        System.out.println("---------------------");

        // 使用反射的的方式

        // 1.获取Class对象的三种方式   (一切皆对象,类也是对象)
        // Class<?> classType = InvokeTest.class;
        Class<?> classType = Class.forName("com.fang.search.service.reflect.InvokeTest");
        // Class<?> classType3 = invokeTest.getClass();

        // 2.Class对象的常用方法 eg
        String className = classType.getName();  // 获取类名
        System.out.println("className:" + className);

        Method[] methods = classType.getMethods(); // 获取类中的所有方法
        for (Method method : methods) {
            System.out.println(method);
        }

        // 3.1 通过Class对象生成对象实例
        Object invokeTest2 = classType.newInstance();
        System.out.println(invokeTest2 instanceof InvokeTest);

        // 3.2 通过Class对象,先生成构造器,再通过构造器生成对象实例
        Constructor<?> constructor = classType.getConstructor(String.class);
        InvokeTest invokeTest3 = (InvokeTest)constructor.newInstance("张三");
        System.out.println(invokeTest3.getName());

        // 4.通过反射调用方法  第一个参数是方法名,第二个参数是方法的参数类型
        Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
        System.out.println(addMethod);

        Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
        System.out.println(echoMethod);

        // 5.调用目标方法
        Object result = addMethod.invoke(invokeTest2, new Object[]{3, 8});
        System.out.println(result);

        Object result2 = echoMethod.invoke(invokeTest2, new Object[]{"Tom"});
        System.out.println(result2);

        // 6.通过反射获取成员变量
        // 通过反射获取:public成员变量和私有成员变量
        Field[] fields = classType.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }

        // 7.给对象的成员变量设置值
        Field age = classType.getField("age");
        age.set(invokeTest3, 30);
        System.out.println("age:"+invokeTest3.getAge());

        Field name = classType.getDeclaredField("name");
        name.set(invokeTest3, "李斯特");
        System.out.println("name:"+invokeTest3.getName() + "  age:"+invokeTest3.getAge());
    }
}

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023国内生产总值(GDP)增长5.05%;越南2023经济增长5.05%;马来西亚2023经济增速为3.7%;泰国2023经济增长1.9%;新加坡2023经济增长1.1%;柬埔寨2023经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013的443亿元增长至 2023合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值