Java学习笔记40

news2024/11/18 19:44:24

Java笔记40

创建运行时类的对象

获取运行时类的完整结构

  • 我们可以通过反射来获取运行时类的完整结构,这包括:
    • 实现的全部接口(Interface)
    • 所继承的父类(Superclass)
    • 全部的构造器(Constructor)
    • 全部的方法(Method)
    • 全部的属性/字段(Field)
    • 注解(Annotation)
    • ……
  • 下面我们写一段代码来练习一下获取类的信息:
  • 首先我们创建一个类:

Dog.java

package com.clown.reflection;

public class Dog {

    //属性
    public String name;
    private int age;
    private String ownerName;

    //无参构造
    public Dog() {
    }

    //有参构造
    public Dog(String name, int age, String ownerName) {
        this.name = name;
        this.age = age;
        this.ownerName = ownerName;
    }

    //get() & set()
    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 String getOwnerName() {
        return ownerName;
    }

    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }

    //重写 toString()
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", ownerName='" + ownerName + '\'' +
                '}';
    }

    public void run() {
        System.out.println(this.getName() + "正在奔跑");
    }

    protected void eat() {
        System.out.println(this.getName() + "正在吃东西");
    }

    private void pee() {
        System.out.println(this.getName() + "正在尿尿");
    }
}
  • 然后我们来尝试获取Dog类中的信息:

Test08.java

package com.clown.reflection;

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

//获得类的信息
public class Test08 {
    public static void main(String[] args) throws Exception {
        Class c1 = Class.forName("com.clown.reflection.Dog");

        //获得类的名字
        System.out.println("=============================== 获得类的名字 ===============================");

        System.out.println("包名+类名: " + c1.getName());  //getName();  获得包名 + 类名

        System.out.println("--------------------------------------------------------------");

        System.out.println("类名: " + c1.getSimpleName());  //getSimpleName();  获得类名

        //获得类的属性
        System.out.println("=============================== 获得类的属性 ===============================");

        Field[] fields = c1.getFields();  //getFields();  获得本类的所有 public属性
        for (Field field : fields) {
            System.out.println("public属性: " + field);
        }

        System.out.println("--------------------------------------------------------------");

        fields = c1.getDeclaredFields();  //getDeclaredFields();  获得本类的所有属性
        for (Field field : fields) {
            System.out.println("所有属性: " + field);
        }

        System.out.println("--------------------------------------------------------------");

        Field name = c1.getDeclaredField("age");  //getDeclaredField(String name);  获得本类中指定的属性
        System.out.println("指定属性: " + name);

        //获得类的方法
        System.out.println("=============================== 获得类的方法 ===============================");

        Method[] methods = c1.getMethods();  //getMethods();  获得本类及其父类的所有 public方法
        for (Method method : methods) {
            System.out.println("public方法: " + method);
        }

        System.out.println("--------------------------------------------------------------");

        methods = c1.getDeclaredMethods();  //getDeclaredMethods();  获得本类的所有方法
        for (Method method : methods) {
            System.out.println("所有方法: " + method);
        }

        System.out.println("--------------------------------------------------------------");

        Method getName = c1.getMethod("getName", null);  //getMethod("XXX", XXX);  获得本类中指定的方法
        System.out.println("指定方法: " + getName);
        Method setName = c1.getMethod("setName", String.class);
        System.out.println("指定方法: " + setName);
        /*
        getMethod(String name, Class<?>... parameterTypes);  获得本类中指定的方法
        参数:
            name参数是一个 String,它指定了所需方法的简单名称。
            parameterTypes参数是以声明顺序标识方法的形式参数类型的类对象的数组。
            如果 parameterTypes是 null ,它被视为一个空数组。
         */

        //获得类的构造器
        System.out.println("============================== 获得类的构造器 ==============================");

        Constructor[] constructors = c1.getConstructors();  //getConstructors();  获得本类的 public构造器
        for (Constructor constructor : constructors) {
            System.out.println("public构造器: " + constructor);
        }

        System.out.println("--------------------------------------------------------------");

        constructors = c1.getDeclaredConstructors();  //getDeclaredConstructors();  获得本类的所有构造器
        for (Constructor constructor : constructors) {
            System.out.println("所有构造器: " + constructor);
        }

        System.out.println("--------------------------------------------------------------");

        Constructor constructor = c1.getConstructor(String.class, int.class, String.class);  //getConstructor(xxx)  获得本类中指定的构造器
        System.out.println("指定构造器: " + constructor);
        /*
        getConstructor(Class<?>... parameterTypes);  获得本类中指定的构造器
        参数:
            parameterTypes参数是以声明顺序标识构造函数的形式参数类型的类对象的数组
         */
    }
}
  • 运行结果:

在这里插入图片描述

获取了Class对象,通过反射我们能做什么?

一、反射创建类的对象

  • 调用Class对象的newlnstance()方法

    • (1)类必须有一个无参数的构造器。
    • (2)类的构造器的访问权限需要足够
  • 思考:难道没有无参的构造器就不能创建对象了吗?

  • 只要在操作的时候明确的调用类中的构造器,调用构造器对象的newInstance(Object ... initargs)方法,并将参数传递进去,就可以实例化对象了。具体步骤如下:

    • (1)通过Class类的getConstructor(Class<?>... parameterTypes)取得本类的指定形参类型的构造器
    • (2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
    • (3)通过构造器(Constructor)实例化对象

二、反射调用类中的方法

  • 通过Method类完成。

    • 通过Class类的getMethod(String name, Class<?>... parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
    • 之后使用public Object invoke(Object obj, Object... args)方法进行调用,并向方法中传递要设置的obj对象的参数信息。

在这里插入图片描述

  • Object invoke(Object obj, Object … args)

    • Object对应原方法的返回值,若原方法无返回值,此时返回null
    • 若原方法为静态方法,此时形参Object obj可为null
    • 若原方法形参列表为空,则Object[] argsnull
    • 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法。
  • setAccessible(boolean flag)

    • MethodFiedConstructor对象都有setAccessible()方法。
    • setAccessible()的作用是启动和禁用访问安全检查的开关。
    • 参数值为true则指示反射的对象在使用时应该取消 Java 语言访问检查。
      • 提高反射的效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么请设置为true
      • 使得原本无法访问的私有成员也可以访问。
    • 参数值为false则指示反射的对象应该实施 Java 语言访问检查。

三、反射操作类中的属性

  • 通过Field类完成。

    • 通过Class类的getDeclaredField(String name)方法取得一个Field对象。
    • 之后使用public void set(Object obj, Object value)方法将obj对象参数上的此Field对象表示的属性设置为指定的新值。
  • 下面我们来写一段程序来测试一下通过反射创建类的对象、调用类中的方法以及操作类中的属性。我们使用上面创建的Dog类创建Class对象:

package com.clown.reflection;

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


public class Test09 {
    public static void main(String[] args) throws Exception {
        //获得 Class对象
        Class c1 = Class.forName("com.clown.reflection.Dog");
        
	    //通过反射,动态的创建对象
        //通过调用 Class对象的 newInstance()创建对象
        System.out.println("================== 通过Class对象的newInstance()方法创建对象 ==================");

        //newInstance();  创建由此类对象表示的类的新实例
//        Object obj = c1.newInstance();
//        Dog dog1 = (Dog)obj;
        Dog dog1 = (Dog)c1.newInstance();  //本质上是调用了 Dog类的无参构造器
        System.out.println(dog1);

        //通过构造器对象的 newInstance(Object ... initargs)方法创建对象
        System.out.println("=============== 通过构造器对象的newInstance(参数值)方法创建对象 ===============");

        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, String.class);

        //newInstance(Object ... initargs);  使用由此 Constructor对象表示的构造函数,用指定的初始化参数创建和初始化构造函数的声明类的新实例
        Dog dog2 = (Dog)constructor.newInstance("旺财", 5, "张三");
        System.out.println(dog2);

        //通过反射调用普通方法
        System.out.println("============================= 通过反射调用方法 ==============================");

        Dog dog3 = (Dog)c1.newInstance();
        Method setName = c1.getDeclaredMethod("setName", String.class);

        //invoke(Object obj, Object... args);  在具有指定参数的 Method对象上调用此 Method对象表示的基础方法。
        //参数: obj - 从底层方法被调用的对象    args - 用于方法调用的参数值
        setName.invoke(dog3, "大黄");
        System.out.println(dog3.getName());

        Method pee = c1.getDeclaredMethod("pee", null);

        //注意: 不能直接操作私有(private)的方法或属性,我们需要先关闭程序的安全检测 - setAccessible(true)

        //setAccessible(boolean flag);  将此对象的 accessible标志设置为指定的布尔值
        //当值为 true时表示反射对象应该在使用时抑制程序的的安全检查。 值为 false时表示反射的对象应该强制执行程序的的安全检查。
        pee.setAccessible(true);
        pee.invoke(dog3, null);

        //通过反射操作属性
        System.out.println("============================= 通过反射操作属性 ==============================");

        Dog dog4 = (Dog)c1.newInstance();
        Field age = c1.getDeclaredField("age");

        age.setAccessible(true);  //关闭程序的安全检测
        //set(Object obj, Object value);  将指定对象参数上的此 Field对象表示的字段设置为指定的新值
        age.set(dog4, 8);
        System.out.println(dog4.getAge());
    }
}
  • 运行结果:

在这里插入图片描述

使用不同方式调用方法的性能测试

  • 在上面我们说过使用setAccessible(boolean flag)方法关闭程序的检测能提高反射的效率,那么是否真是如此呢?又大概提高了多少呢?下面我们就写一段程序来测试一下使用不同的方式调用方法对性能的影响:
package com.clown.reflection;

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

//测试性能
public class Test10 {

    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        test01();
        test02();
        test03();
    }

    //普通方式调用
    public static void test01() {
        Dog dog = new Dog();

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 1000000000; i++) {
            dog.getName();
        }

        long endTime = System.currentTimeMillis();

        System.out.println("普通方式执行10亿次的时间: " + (endTime - startTime) + "毫秒");
    }

    //反射方式调用
    public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Dog dog = new Dog();
        //获取 Class对象
        Class c1 = dog.getClass();
        //获取 Method对象
        Method getName = c1.getDeclaredMethod("getName", null);

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(dog, null);  //调用方法
        }

        long endTime = System.currentTimeMillis();

        System.out.println("反射方式执行10亿次的时间: " + (endTime - startTime) + "毫秒");
    }

    //反射方式调用,关闭检测
    public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Dog dog = new Dog();
        //获取 Class对象
        Class c1 = dog.getClass();
        //获取 Method对象
        Method getName = c1.getDeclaredMethod("getName", null);

        getName.setAccessible(true);  //关闭检测

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(dog, null);  //调用方法
        }

        long endTime = System.currentTimeMillis();

        System.out.println("反射方式并关闭检测执行10亿次的时间: " + (endTime - startTime) + "毫秒");
    }
}
  • 运行结果:

在这里插入图片描述

四、拓展:反射操作泛型

  • Java 采用泛型擦除的机制来引入泛型,Java 中的泛型仅仅是给编译器 Javac 使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。
  • 为了通过反射操作这些类型,Java新增了ParameterizedTypeGenericArrayTypeTypeVariableWildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型。
    • ParameterizedType:表示一种参数化类型,比如Collection<String>
    • GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型。
    • TypeVariable:是各种类型变量的公共父接口。
    • WildcardType:代表一种通配符类型表达式。
  • 下面我们编写代码来练习一下如何通过反射来获取泛型:
package com.clown.reflection;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

//通过反射获取泛型
public class Test11 {

    public static void main(String[] args) throws NoSuchMethodException {
        System.out.println("=========================== 获取方法test01()的形式参数类型 ============================");

        Method method1 = Test11.class.getDeclaredMethod("test01", Map.class, List.class);

        //getGenericParameterTypes();  返回一个 Type对象的数组,Type[]以声明顺序表示由该 Method对象表示的方法的形式参数类型
        Type[] genericParameterTypes = method1.getGenericParameterTypes();

        for (Type genericParameterType : genericParameterTypes) {
            System.out.println("test01()方法的形式参数的类型: " + genericParameterType);
            //ParameterizedType接口: 表示一个泛型,如 Collection <String>
            if (genericParameterType instanceof ParameterizedType) {  //判断该形式参数是否为泛型
                //getActualTypeArguments();  返回一个表示此类型的实际类型参数的数组 Type对象
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println("此泛型的实际类型参数类型: " + actualTypeArgument);
                }
            }
        }

        System.out.println("============================ 获取方法test02()的返回值类型 ============================");

        Method method2 = Test11.class.getDeclaredMethod("test02", null);

        //getGenericReturnType();  返回一个 Type对象,它表示由该 Method对象表示的方法的正式返回类型
        Type genericReturnType = method2.getGenericReturnType();

        System.out.println("test02()方法的返回值的类型: " + genericReturnType);

        if (genericReturnType instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println("此泛型的实际类型参数类型: " + actualTypeArgument);
            }
        }

    }

    //定义一个方法,它的形式参数为泛型
    public void test01(Map<String, Dog> map, List<Dog> list) {
        System.out.println("test01");
    }

    //定义一个方法,它的返回值类型类型为泛型
    public Map<String, Dog> test02() {
        System.out.println("test02");
        return null;
    }

}
  • 运行结果:

在这里插入图片描述

了解什么是ORM

  • Object Relationship Mapping --> 对象关系映射
    在这里插入图片描述
    • 类和表结构对应
    • 属性和字段对应
    • 对象和记录对应
  • 要求:利用注解和反射完成类和表结构的映射关系

五、反射操作注解

  • 我们知道通过Class类的getAnnotations()方法可以获取该类的所有注解。
  • 但是怎样才能获取类中指定的注解呢?
  • 例如:我们想获得类中某个属性(Filed)的注解,那我们只需要先获得该属性的Filed对象,然后再使用该Filed对象的getAnnotation(Class<A> annotationClass)方法,并传入我们想要获取的注解的Class对象,即可获得该注解。同理,若我们想获得某个类(Class)/方法(Method)等的指定的注解也是使用getAnnotation(Class<A> annotationClass)方法。
package com.clown.reflection;

import java.lang.annotation.*;
import java.lang.reflect.Field;

//通过反射操作注解
//ORM
public class Test12 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //获得 Class对象
        Class c1 = Class.forName("com.clown.reflection.Student2");

        //通过反射获得注解
        Annotation[] annotations = c1.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }

        //获得注解的 value的值
        TableClown tableClown = (TableClown) c1.getAnnotation(TableClown.class);
        String value = tableClown.value();
        System.out.println(value);

        System.out.println("===================================================");

        //获得类中的指定的注解
        Field f = c1.getDeclaredField("id");
        FiledClown filedClown = f.getAnnotation(FiledClown.class);
        System.out.println(filedClown);

        //获取并打印注解的参数的值
        System.out.println(filedClown.columnName());
        System.out.println(filedClown.type());
        System.out.println(filedClown.length());
    }

}

//创建一个实体类 -->  学生类
@TableClown("db_student")
class Student2 {
    //属性
    @FiledClown(columnName = "bd_id", type = "int", length = 10)
    private int id;
    @FiledClown(columnName = "bd_age", type = "int", length = 3)
    private int age;
    @FiledClown(columnName = "bd_name", type = "varchar", length = 4)  //在数据库中,"String" 一般用 "varchar" 表示
    private String name;

    //无参构造
    public Student2() {
    }

    //有参构造
    public Student2(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    //get() & set()
    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;
    }

    public String getName() {
        return name;
    }

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

    //重写 toString()
    @Override
    public String toString() {
        return "Student2{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

//自定义创建一个【类】的注解
@Target(ElementType.TYPE)  //@TableClown可以放在【类】上
@Retention(RetentionPolicy.RUNTIME)  //@TableClown在源码时、编译为 class时以及运行时都有效
@interface TableClown {
    String value();  //参数: 数据库名
}

//自定义创建一个【属性】的注解
@Target(ElementType.FIELD)  //@FiledClown可以放在【属性】上
@Retention(RetentionPolicy.RUNTIME)  //@FiledClown在源码时、编译为 class时以及运行时都有效
@interface FiledClown {
    String columnName();  //参数: 列名
    String type();  //参数: 类型
    int length();  //参数: 长度
}
  • 运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/920003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10 Mybatis

文章目录 1 概述1.1 什么是Mybatis?1.2 JDBC介绍(了解)1.2.1 问题分析1.2.2 技术对比 1.3 数据库连接池1.4 lombok 2 Mybatis基础操作2.1 准备2.2 删除2.2.1 日志输入2.2.2 预编译SQL2.2.2.1 介绍2.2.2.2 SQL注入2.2.2.3 参数占位符 2.3 新增2.3.1 主键返回 2.4 更新2.5 查询2…

Java 内置注解

一、内置注解 Java内置注解 也称 Java标准注解&#xff0c;是Java JDK 中自带的注解。Java 中有许多标准注解&#xff0c;以下是一些常见的标准注解&#xff1a; 1. Override&#xff1a;用于表示一个方法是重写父类中的方法。 2. Deprecated&#xff1a;用于标记已经过时的方法…

vue 使用print.js打印小票

官网&#xff1a;https://printjs.crabbly.com/ // 安装 npm install print-js --save// 引入 import printJS from print-js// 使用 printJS({printable: https://hwke.tbbug.com/images/phone/1899ed9346f64020ff4f9bbae6983952.jpg,type: image,imageStyle: width:100%;ma…

linux系统(centos、ubuntu、银河麒麟服务、uos、deepin)判断程序是否已安装,通用判断方法:使用所有应用和命令的判断

前言 项目中需要判断linux服务器中是否已经安装了某个服务 方法有很多种&#xff0c;但是很多都不通用&#xff0c; 脚本代码就不容易做成统一的 解决方案 用下面的脚本代码去进行判断 用jdk测试 脚本意思如下&#xff1a; 输入java -version命令&#xff0c;将返回的字…

react hooks 计数器

180秒倒计时 const [count, setCount] useState(0)setCount(180)useEffect(() > {clearTimeout(timer)timer setTimeout(() > {if (count > 1) {setCount(count - 1)} else {setIsSendEmail(false)}}, 1000)// eslint-disable-next-line}, [count]) import { useSta…

STM32 无法烧录

1. 一直显示芯片没连接上&#xff0c;检查连线也没问题&#xff0c;换了个ST-Link 烧录器还是连不上&#xff0c;然后又拿这个烧录器去其它板子上试下&#xff0c;就可以连接上&#xff0c;说明我连线没问题&#xff0c;烧录器也没问题&#xff0c;驱动什么的更是没问题&#x…

Kubernetes(K8S)简介

Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具&#xff0c;由 Google 开发。Kubernetes 这个名字源于希腊语&#xff0c;意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…

openCV实战-系列教程3:形态学操作(腐蚀操作/膨胀操作/开运算/闭运算/梯度计算/礼帽和黑帽)、源码解读

1、腐蚀操作 1.1 腐蚀 首先读进来并打印一张图 img cv2.imread(yzy.jpg) cv2.imshow(img, img) cv2.waitKey(0) cv2.destroyAllWindows() 这个图片出现了一些毛刺&#xff0c;看着挺难受 执行一个腐蚀操作&#xff0c;再将图片打印出来&#xff1a; kernel np.ones((3,3…

工厂方法模式介绍

韩敬海 设计模式&#xff08;Java版&#xff09; &#xff08;一&#xff09;定义 定义一个创建对象的接口&#xff0c;让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法涉及的角色有&#xff1a; 1 .抽象工厂角色&#xff1a;工厂方法模式的核心&am…

从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题

目录 1. 可变参数模板 1.1 展开参数包 1.1.1 递归函数方式展开 1.1.2 逗号表达式展开 1.2 emplace相关接口 2. lambda表达式&#xff08;匿名函数&#xff09; 2.1 C11之前函数的缺陷 2.2 lambda表达式语法 2.3 函数对象与lambda表达式 3. 包装器 3.1 function包装器…

最新AI系统ChatGPT程序源码/微信公众号/H5端+搭建部署教程+完整知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

ARM DIY(三)板载串口和 LCD 调试

前言 今天焊接两大关键输入输出设备&#xff1a;串口和屏幕。 串口 串口部分使用 CP2102N 芯片&#xff08;USB 转 TTL&#xff09;&#xff0c;这样用一根数据线连接板子和 PC 就可以直接调试了。 焊接 CP2102 和 Type C 上电调试&#xff0c;串口可以正常输入输出。 看来…

css实现文字的渐变,适合大屏

1 在全局写一个全局样式&#xff0c;文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 &#xff1f;_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…

ui设计师简历自我评价(合集)

UI设计最新面试题及答案 1、说说你是怎么理解UI的? UI是最直观的把产品展示展现在用户面前的东西&#xff0c;是一个产品的脸面。人开始往往是先会先喜欢上美好的事物后&#xff0c;在去深究内在的东西的。 那么也就意味着一个产品的UI首先要做的好看&#xff0c;无论风格是…

tensordataset 和dataloader取值

测试1 from torch.utils.data import TensorDataset,DataLoader import numpy as np import torch a np.array([[1,2,3],[2,3,3],[1,1,2],[10,10,10],[100,200,200],[-1,-2,-3]]) print(a)X torch.FloatTensor(a) print(X)dataset TensorDataset(X,X)测试2 from torch.uti…

基于PHP的电脑商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的电脑商城系统 一 介绍 此电脑商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台对电脑商品&#xff0c;用户&#xff0c;订单&a…

根据案例写PLC程序-小车往返运动

案例&#xff1a;有一台运料小车在一条直线上来回运行&#xff0c;下面有4个行程开关&#xff0c;有2个点动按钮&#xff0c;手动状态下可以控制小车左右移动。 1、自动状态下&#xff0c;按下启动按钮&#xff0c;小车会按照以下轨迹运行&#xff0c;小车反转到SO1位置…

图为科技-边缘计算在智慧医疗领域的作用

边缘计算在智慧医疗领域的作用 随着科技的进步&#xff0c;智慧医疗已成为医疗行业的重要发展趋势。边缘计算作为新兴技术&#xff0c;在智慧医疗领域发挥着越来越重要的作用。本文将介绍边缘计算在智慧医疗领域的应用及其优势&#xff0c;并探讨未来发展方向。 一、边缘计算…

2021年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;酒鬼 Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天&#xff0c;他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴的是&#xff0c;瓶子中的酒都有不同的味道。房东说道&#xff1a;“你可以…

机器学习-使用 XGBoost 时间序列预测能源消耗

简而言之&#xff0c;时间序列预测是根据以前的历史数据预测未来值的过程。目前使用时间序列预测的最热门领域之一是加密货币市场&#xff0c;人们希望预测比特币或以太坊等流行加密货币的价格在未来几天甚至更长时间内将如何波动。另一个现实世界的案例是能源消耗预测。尤其是…