当前位置: 首页 > news >正文

【Java常用】注解与反射_2.反射

目录标题

  • 1.Java反射机制概述
    • 1.静态 VS 动态语言
      • 1.1动态语言
        • 举例展示JavaScript作为动态语言的特性
            • 1. 运行时代码生成和执行
            • 2.动态变量创建
            • 3.对比静态语言(如 Java):
      • 1.2 静态语言
  • 2.理解Class类并获取Class实例
  • 3.类的加载与ClassLoader
  • 4.创建运行时类的对象
  • 5.获取运行时类的完整结构
  • 6.调用运行时类的指定结构

1.Java反射机制概述

1.静态 VS 动态语言

1.1动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:0bject-C、C#、JavaScript、PHP、Python等
比如

举例展示JavaScript作为动态语言的特性
function f() {
    var x = "var a=3;var b=5;alert(a+b)";
    eval(x);
}

这段代码很好地展示了JavaScript作为动态语言的特性,让我解释原因:

1. 运行时代码生成和执行

javascript

var x = “var a=3;var b=5;alert(a+b)”;
eval(x);

代码是以字符串形式存在的
这些代码是在运行时被解析和执行的,而不是在编译时
程序可以在运行过程中动态生成和执行新的代码

2.动态变量创建

变量 a 和 b 不是预先定义的
它们是在代码运行时,通过 eval 执行字符串时才被创建的
这体现了变量可以动态创建的特性

3.对比静态语言(如 Java):

java

// Java 需要预先声明变量类型,不能动态执行字符串代码
String x = “int a=3; int b=5; System.out.println(a+b)”;
// 不能直接执行字符串作为代码

这个例子展示了 JavaScript 的两个重要动态特性:

代码可以在运行时动态生成和执行
变量可以在运行时动态创建和修改

1.2 静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性我们可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活!

在这里插入图片描述
反射就像是一面镜子,让我们能够在运行时"照见"类的内部结构。

// 传统方式创建对象
User user = new User();

// 反射方式创建对象
Class c = Class.forName("com.example.User");
Object obj = c.newInstance();

正常方式 vs 反射方式:

正常方式:

引入需要的包/类名
使用 new 实例化
获得实例化对象

反射方式:

已有实例化对象
使用 getClass() 方法
获得完整的类名

反射的主要用途:

// 获取类的信息
Class c = Class.forName("java.lang.String");

// 获取类的方法
Method[] methods = c.getMethods();

// 获取类的属性
Field[] fields = c.getFields();

// 调用方法
Method method = c.getMethod("length");
Object result = method.invoke(str);

为什么需要反射:

		Java反射机制研究及应用
		Java反射机制提供的功能
		在运行时判断任意一个对象所属的类
		在运行时构造任意一个类的对象
		在运行时判断任意一个类所具有的成员变量和方法
		在运行时获取泛型信息
		在运行时调用任意一个对象的成员变量和方法
		在运行时处理注解
		生成动态代理
		 可以在运行时检查类、接口、方法和字段
		 可以在运行时调用任意方法
		 可以在运行时创建新对象
		 让Java具有动态语言的特性

Java反射优点和缺点

优点
可以实现动态创建对象和编译,体现出很大的灵活性

缺点:
使用反射基本上是一种解释操作,我们可以告诉JVM>对性能有影响我们希望做什么并且它满足我们的要求。这类操作总是慢于 直接执行相同的操作。

简单来说,反射就像是给Java装上了"透视眼",能够在程序运行时看到并操作类的内部结构,这是Java被称为动态语言的重要原因之一。

反射相关的主要API

	>java.lqng.Class:代表一个类
	>java.lang.reflect.Method:代表类的方法
	>java.lang.reflect.Field:代表类的成员变量
	>java.lang.reflect.Constructor:代表类的构造器

API 让我们能够:

	在运行时检查类的结构
	调用任意方法
	访问任意字段
	创建新的对象
	修改访问权限

这就像是给了我们一把"万能钥匙",可以在程序运行时访问和操作类的所有组成部分。

复习泛型
1.

package com.zyy.refletion;

import java.util.ArrayList;

//什么叫反射
public class Test02 {

    public static void main(String[] args) throws ClassNotFoundException {
//        通过反射获取类的class对象
        Class<?> aClass = Class.forName("com.zyy.refletion.User");





//1、没有泛型时的问题
//        想要一个存放整数的集合

        ArrayList list = new ArrayList();
        list.add(1); //添加整数 byte short int long int默认值是0不能为null

        int num = (int) list.get(0);//从数组中取出后 必须通过int 强转后,才能赋值给int

//        2、使用泛型后
//明确指定集合中存放的是整数
        ArrayList<Integer> list1 = new ArrayList<Integer>();  //int 是基本数据类型,Integer 是类,包装类,有更多的方法可以使用
        list.add(1); //添加整数
        int num1 = list1.get(0);//不需要强制类型转换


//        3.场景实例
//     现在需要不同类型的盒子: 只能装水果的盒子  只能装书的盒子  只能装玩具的盒子
//        T可以十四任何类型的物品,比如fruit book toy
        class Box<T> {
            private T item;//盒子里面的东西  私有化变量
            // 拿和取的动作 get set

            public void setItem(T item) { // 放东西进盒子

                this.item = item;
            }

            public T getItem() {// 从盒子取东西
                return item;
            }
        }


// 首先定义 Fruit 类
        class Fruit {
            private String name;

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

            public String getName() {
                return name;
            }
        }




        // 创建一个装水果的盒子
        Box<Fruit> fruitBox = new Box<>();

        // 创建一个水果并放入盒子
        Fruit apple = new Fruit("苹果");
        fruitBox.setItem(apple);

        // 从盒子中取出水果
        Fruit fruit = fruitBox.getItem();
        System.out.println(fruit.getName());  // 输出:苹果



        

    }


}





 /*   实体类的作用:

    存储数据:就像一个容器,用来存放某个对象(比如学生)的所有信息
    规范数据:确保数据的格式正确(比如年龄必须是数字)
    传递数据:在程序的不同部分之间传递完整的信息

    简单来说,实体类就是用来描述一个现实世界中的"东西"(比如学生、商品、订单等)的Java类,它主要负责数据的存储和传递。*/


//    实体类  只有一些私有属性(就像表格中要填的项目)
class User {

    //        私有属性
    private String name;
    private int id;
    private int age;

// 无参构造


    public User() {
    }
//    有参构造


    public User(String name, int id, int age) {
        this.name = name;
        this.id = id;
        this.age = age;
    }


// 因为是私有属性 所以为了访问和修改数据,还要get set
    // 获取信息的方法(读取表格)

    public String getName() {
        return name;
    }
    // 设置信息的方法(填写表格)

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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


    // 加上toSreing  方便调试
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}

2.理解Class类并获取Class实例

3.类的加载与ClassLoader

4.创建运行时类的对象

5.获取运行时类的完整结构

6.调用运行时类的指定结构

相关文章:

  • 讯方·智汇云校华为授权培训机构的介绍
  • DeepSeek的开源核爆:当技术民主化重构AI权力版图
  • 常用数据格式:json、bson、msgpack
  • POI 的 Excel 读写操作教程
  • Ubuntu 22.04 - OpenLDAP安装使用(服务器+LAM+客户端)
  • 对正则表达式说不!!!
  • 【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决
  • CentOS本机配置为时间源
  • 自定义基座实时采集uniapp日志
  • depcheck检查node.js项目中未使用和缺失依赖的工具
  • 【Apache Paimon】-- 作为一名小白,如何系统地学习 Apache paimon?
  • Ansible批量配置服务器免密登录步骤详解
  • 【pytest】获取所有用例名称并存于数据库
  • 联想电脑如何进入BIOS?
  • 新数据结构(9)——Java异常体系
  • AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI
  • 【Vue3 入门到实战】15. 组件间通信
  • CEF132 编译指南 Linux 篇 - 构建编译环境:工具链配置(二)
  • DatePicker 实现:日期范围截止时间为23:59:59
  • 蓝桥杯备赛笔记(二)
  • php 手机网站/怎么做电商卖东西
  • 北风淘淘网站开发/大搜推广
  • 企业网站seo诊断报告/谷歌收录提交入口
  • webform网站开发经历/网站怎样优化seo
  • 北京网站建设的价格/专业拓客团队怎么收费
  • 招应届培训网页设计/云南seo网站关键词优化软件