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

Java反射详细学习笔记

动态代理

特点 : 无侵入式的给代码增加额外的功能 ;

代理里面就是对象要被代理的方法 ;

通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ;

如何为java对象创建一个代理 :

  • java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法 :

    public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)
    参数一 : 用于指定用那个类加载器,去加载生成的代理类
    参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法
    参数三 : 用来指定生成的代理对象要干什么事情

实例代码 :

首先是一个需要代理的对象 : BigStar :

package com.it.yss;
​
public class Bigstar implements Star{private String name ;
​public Bigstar() {}
​public Bigstar(String name) {this.name = name;}
​// 唱歌 , 跳舞@Overridepublic String sing(String name){System.out.println(this.name+"正在唱 : " + name);return "谢谢" ;}
​@Overridepublic void dance(){System.out.println(this.name+"正在跳舞。") ;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
}

定义接口Star,指定需要被代理的方法 :

package com.it.yss;
​
public interface Star {// 我们可以把所有想被代理的方法定义在接口当中
​// 唱歌public abstract String sing(String name) ;
​// 跳舞public abstract void dance() ;
​
}

创建代理ProxyUtil :

package com.it.yss;
​
​
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
​
/**** 类的作用 :*  创建一个代理**/
public class ProxyUtil {/*** 方法的作用 :*  给一个明星的对象 ,创建一个代理** 形参 :*  被代理的明星对象**  返回值 :*      给明星创建的代理**  需求 :*      外面的人想要大明星唱一首歌*      1 . 获取代理的对象*          代理对象 = ProxyUtil.createProxy(大明星的对象)*      2 . 再 调用代理的唱歌对象*          代理对象.唱歌的方法("歌曲的名称") ;*/public static Star createProxy(Bigstar bigstar){/*java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法
​public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)参数一 : 用于指定用那个类加载器,去加载生成的代理类参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法参数三 : 用来指定生成的代理对象要干什么事情
​*/Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//参数一 : 用于指定用那个类加载器,去加载生成的代理类new Class[]{Star.class},//指定接口,这些接口用于指定生成的代理长什么,也就是什么方法// 参数三 : 用来指定生成的代理对象要干什么事情new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*** 参数一 : 代理的对象* 参数二 : 要运行的方法 sing* 参数三 : 调用sing方法时 , 传递的实参*/if("sing".equals(method.getName())){System.out.println("准备话筒 , 收钱");}else if("dance".equals(method.getName())){System.out.println("准备场地 , 收钱");}// 去找大明星唱歌或者跳舞// 代码的表现形式 : 调用大明星里面唱歌或者跳舞的方法return method.invoke(bigstar,args);}}) ;
​return star ;
​
​
​}
}

测试 :

package com.it.yss;
​
public class test {public static void main(String[] args) {
//     *  需求 :
//     *      外面的人想要大明星唱一首歌
//                *      1 . 获取代理的对象
//                *          代理对象 = ProxyUtil.createProxy(大明星的对象)
//                *      2 . 再 调用代理的唱歌对象
//                *          代理对象.唱歌的方法("歌曲的名称") ;// 1 . 获取代理的对象Bigstar bigstar = new Bigstar("鸡哥") ;Star proxy = ProxyUtil.createProxy(bigstar) ;
​// 2 . 调用唱歌的方法String result = proxy.sing("只因你太美") ;System.out.println(result);
​// 3 . 调用跳舞的方法proxy.dance();}
}

调用步骤 :

反射

概念 :

反射 :

反射允许对封装类的成员变量,成员方法和构造方法的信息进行编程访问 ;

一个类包括 :

  • 字段(成员变量)

  • 构造方法

  • 成员方法

而反射就可以将这些获取出来 , 例如idea中的类方法或构造函数参数提示就是依靠反射实现的 :

获取class对象的三种方式 :

  1. Class.forName("全类名")

  2. 类名.class

  3. 对象.getClass() ;

代码实例 :

package com.it.yss;
​
public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {/***  获取class对象的三种方式 :*         1. Class.forName("全类名")*         2. 类名.class*         3. 对象.getClass() ;*/// 1. 第一种方式// 全类名 : 包名 + 类名 com.it.yss.Student// 最为常用的Class Clazz = Class.forName("com.it.yss.Student");// 打印 :System.out.println(Clazz);
​// 2 .第二种方式// 一般更多的是当作参数进行传递Class Clazz2 = Student.class ;System.out.println(Clazz2==Clazz);
​// 3 . 第三种方式// 当有了这个类的对象的时候 , 才能使用Student stu = new Student();Class Clazz3 = stu.getClass();System.out.println(Clazz3==Clazz2);}
}

可以看到全是相等的 ,输出结果 :

class com.it.yss.Student
true
true

在java中 , 万事皆可看作对象 :

获取构造方法 :

实例 :

Student类 :

package com.it.myreflect2;
​
public class Student {private String name ;private int age;
​public Student() {}
​public Student(String name){this.name = name;}
​public Student(int age){this.age = age;}
​public Student(String name, int age) {this.name = name;this.age = 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;}
​@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

1 . 获取字节码文件对象 :

Class clazz = Class.forName("com.it.myreflect2.Student");

2 . 获取构造方法

        // 2 . 2 获取所有构造方法Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor c : cons2) {System.out.println(c);}
​System.out.println("------------------------");
​// 2 . 3 获取空参构造方法Constructor con1 = clazz.getDeclaredConstructor() ;System.out.println(con1);
​System.out.println("------------------------");
​// 2 . 4 获取对应的构造方法(传入对应参数的字节码文件)Constructor con2 = clazz.getDeclaredConstructor(String.class);System.out.println(con2);Constructor con3 = clazz.getDeclaredConstructor(int.class);System.out.println(con3);Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con4);
​System.out.println("------------------------");

输出结果 :

public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
------------------------
public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------
public com.it.myreflect2.Student()
------------------------
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------

3 . 获取构造方法修饰权限符

// 3 获取方法修饰权限符
int modifiers = con4.getModifiers();
System.out.println(modifiers);
​
System.out.println("------------------------");

这里输出结果是2 , 看api文档可以发现2对应的是private ;

4 . 获取构造方法参数

用con.getParameters()来获得对应的参数列表 :

Parameter[] parameters = con4.getParameters();
for (Parameter p : parameters) {System.out.println(p);
}

输出结果 :

java.lang.String arg0
int arg1

5 . 用反射创建对象

// 暴力反射 : 临时取消权限校验(原本是私有构造方法)
con4.setAccessible(true);
// 创建对象
Student stu = (Student) con4.newInstance("张三",23);
System.out.println(stu);

输出结果 :

Student{name='张三', age=23}

利用反射获取成员变量

Student类 :

package com.it.myreflect3;
public class Student {private String name ;private int age;public String gender ;public Student() {}public Student(int age, String gender, String name) {this.age = age;this.gender = gender;this.name = name;}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

1 . 获取成员变量 :

        // 2 . 获取成员变量Field[] fields1 = clazz.getFields() ;//获取公共Field[] fields2 = clazz.getDeclaredFields() ;// 获取所有for(Field f : fields1){System.out.println(f);}System.out.println("--------------");for(Field f : fields2){System.out.println(f);}System.out.println("--------------");// 获取单个成员变量Field gender = clazz.getDeclaredField("gender");System.out.println(gender);

输出结果 :

public java.lang.String com.it.myreflect3.Student.gender
--------------
private java.lang.String com.it.myreflect3.Student.name
private int com.it.myreflect3.Student.age
public java.lang.String com.it.myreflect3.Student.gender
--------------
public java.lang.String com.it.myreflect3.Student.gender

2 . 获取权限修饰符

int modifiers = gender.getModifiers();
System.out.println(modifiers);

输出结果 :

1

1代表public

3 . 获取成员变量,类型

String ys = gender.getName() ;
System.out.println(ys);
Class<?> type = gender.getType();
System.out.println(type);

输出结果 :

gender
class java.lang.String

4 . 获取成员变量记录的值

Student s = new Student(23,"男","张三");
Object value = gender.get(s) ;
System.out.println(value);

输出结果 :

5 . 修改对象里面记录的值

gender.set(s,"女");
System.out.println(s);

输出结果 :

Student{name='张三', age=23, gender='女'}

获取成员方法

Student类 :

package com.it.myreflect4;
​
import java.io.IOException;
​
public class Student {private String name ;private int age;
​public Student() {}
​private Student(String name, int age) {this.name = name;this.age = age ;}
​public void sleep(){System.out.println("睡觉");}
​private String eat(String food) throws IOException {System.out.println("在吃"+food);return "奥里给" ;}
​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;}
​@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注 : 多加了eat()和sleep();

完整代码 :

package com.it.myreflect4;
​
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
​
public class test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {// 1 . 获取字节码文件对象Class clazz = Class.forName("com.it.myreflect4.Student");
​// 2 . 获取所有的方法对象(包含父类中所有的公共方法)Method[] methods= clazz.getMethods();for(Method method:methods){System.out.println(method);}
​//获取所有的方法对象(不能获取父类的,但是可以获取本类中私有的方法)Method[] methods1= clazz.getDeclaredMethods();for(Method method:methods1){System.out.println(method);}
​// 获取指定的单一方法Method m = clazz.getDeclaredMethod("eat", String.class) ;System.out.println(m);
​// 获取方法的修饰符int modify = m.getModifiers();System.out.println(modify);
​// 获取方法的名字String name = m.getName() ;System.out.println(name);
​// 获取方法的形参Parameter[] ps = m.getParameters();for(Parameter p : ps){System.out.println(p);}
​// 获取方法抛出的异常 :Class[] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}
​// 方法运行/*Method类中用于创建对象的方法Object invoke(Object obj,Object... args): 运行方法参数一 : 用obj对象调用该方法参数二 : 调用方法的传递的参数(如果没有就不写)返回值: 方法的返回值(如果没有就不写)*/Student s = new Student() ;m.setAccessible(true);String ts = (String) m.invoke(s, "汉堡包");System.out.println(ts);
​}
}

输出结果 :

public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
2
eat
java.lang.String arg0
class java.io.IOException
在吃汉堡包
奥里给

反射的作用

  1. 获取一个类里面的所有的信息 , 获取到之后,再执行其它的业务逻辑

  2. 结合配置文件,动态的创建对象并调用方法

总结 :

相关文章:

Java反射详细学习笔记

动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 &#xff0c; 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…...

区块链在艺术市场中的创新:数字艺术品的溯源与版权保护

随着数字技术的迅猛发展&#xff0c;数字艺术品正逐渐成为艺术市场的重要组成部分。然而&#xff0c;数字艺术品的复制和版权问题日益突出&#xff0c;传统的版权管理方式面临挑战。区块链技术作为一种去中心化的分布式账本技术&#xff0c;为解决这些问题提供了新的可能性。本…...

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…...

鸿蒙界面开发

界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名&#xff08;参数&#xff09; 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…...

【JavaScript】use strict

“use strict” 声明时&#xff0c;代码将会在严格模式下执⾏。严格模式包含了⼀些额外的规则和限制。 使⽤ “use strict” 的主要作⽤包括&#xff1a; 变量必须声明后再使⽤&#xff0c;不能通过不使⽤关键字创建全局变量不能通过 delete 操作符删除变量&#xff08;包括对…...

Linux云计算 |【第一阶段】SERVICES-DAY3

主要内容&#xff1a; 分离解析介绍、NTP时间服务、基础邮件服务&#xff08;MX记录&#xff09;、部署postfix邮件服务器、自定义YUM仓库 实操提前准备&#xff1a; ① 设置SELinux、关闭防火墙服务&#xff08;两台主机&#xff09; [rootsvr7 ~]# getenforce Permissive …...

Java面试八股之Spring-boot-starter-parent的作用是什么

Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM&#xff08;Project Object Model&#xff09;&#xff0c;它主要的作用是提供一系列默认的配置和依赖管理&#xff0c;以便简化项目的构建过程。以下是spring-boot-sta…...

Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL

在使用 Amazon S3 存储服务时,我们经常需要获取存储桶中对象的 HTTPS URL。这篇博文将详细介绍如何使用 Python 和 Boto3 库来实现这一功能。 背景 Amazon S3(Simple Storage Service)是一种广泛使用的云存储服务。在许多场景中,我们需要获取 S3 存储桶中对象的公开访问 …...

V-bind动态绑定style的案例集合

目录 绑定对象 绑定数组 绑定函数 V-bind 动态绑定 Class 的案例集合-CSDN博客 绑定对象 示例代码如下: <!--html--> <p :style="{width:widthVal,height:heightVal,border:borderVal}">段落</p> <!--js--> data(){ ret…...

深度学习守护夜行安全:夜视行人检测系统详解

基于深度学习的夜视行人检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 夜视行人检测在自动驾驶和智能监控中至关重要。然而&#xff0c;由于光线不足&#xff0c;夜间行人检测面临巨大挑战。深度学习技术&#xff0c;特别是YOLO&#xff08;You…...

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…...

如何减少白屏的时间

前端性能优化是前端开发中一个重要环节&#xff0c;它包括很多内容&#xff0c;其中页面的白屏时间是用户最初接触到的部分&#xff0c;白屏时间过长会显著影响用户的留存率和转换率。 我们以一个 APP 内嵌 Webview 打开页面作为例子&#xff0c;来分析页面打开过程以及可优化…...

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展&#xff0c;最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度&#xff0c;充分利用现有计算资源&#xff0c;显著提升长安链交易处理速度。 随着区块…...

go语言学习文档精简版

Go语言是一门开源的编程语言&#xff0c;目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力&#xff0c;以及在现代语言中所见到的高级特性。 你好&#xff0c;Go package main // 程序组织成包import "fmt" // fmt包用于格式化输出数据// …...

立元科技-Java面经

面试时间&#xff1a;2024年2月13日 面试地点&#xff1a;线下 面试流程&#xff1a;一轮面试 首先写了点笔试题&#xff0c;但是人家根本不看&#xff08;这个也就一面&#xff09; &#xff08;聊的还行&#xff0c;但是公司环境不是特别的好&#xff0c;一次面试&#x…...

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,…...

新版SpringSecurity5.x使用与配置

目录 一、了解SpringSecurity 1.1 什么是Spring Security&#xff1f; 1.2 Spring Security功能 1.3 Spring Security原理 1.4 RABC (Role-Based Access Control) 二、SpringSecurity简单案例 2.1 引入SpringSecurity依赖 2.2 创建一个简单的Controller 三、SpringSecu…...

JavaScript实战 - JavaScript 中实现线程锁

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言&#xff1a; …...

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求&#xff0c;需要将图像中的人物区分为成人和小孩&#xff0c;这是一个典型的二分类问题…...

20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习

在Java开发中&#xff0c;‌controller、‌dao、‌do、‌mapper等概念通常与MVC&#xff08;‌Model-View-Controller&#xff09;‌架构和分层设计相关。‌这些概念各自承担着不同的职责&#xff0c;‌共同协作以构建和运行一个应用程序。‌以下是这些概念的解释&#xff1a;‌…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...