【Java】韩顺平Java学习笔记 第23章 反射

Java后端技术学习体系—韩顺平 文章目录第一部分:Java基础变量、控制结构、OOP(封装,继承,多态)、数组、Java API、异常和处理、集合、泛型、IO、反射、网络通信第二部分:Java高级1. Java多线程/高并发1.1 并发基础互斥同步、非阻塞同步、指令重排、synchronized、 volatile1.2 线程1.3 锁自动锁、偏向锁、可重入锁1.4 线程池1.5 并发容器1.6 JUCexecutor、collections、locks、alomic(原子类)、tools2. 数据结构和算法2.1 数据结构数组(数组问题 阅读详情

需求和快速入门

  • 目的:通过外部文件配置,不修改源码的情况下,来控制程序(也符合设计模式的开闭原则,不修改源码拓展程序)

  • 步骤(假设配置文件配置的类名字是classname,里面有一个方法,名字为methodName)

    • 加载类,返回一个Class类型的对象(是一个类,类名叫Class)

      Class cls = Class.forName(classname)

    • 通过 cls 得到加载的类的对象实例

      Object obj = cls.newInstance()

    • 通过 cls 得到加载的类的 methodName“hi” 的方法对象(Method 类型的对象),即在反射中,可以把方法视为对象(万物皆对象)

      Method method1 = cls.gerMethod(methodName)

    • 通过 method1 调用方法,即通过方法对象来实现调用方法

      传统方法:对象.方法()

      反射机制:方法.invoke(对象)

      method1.invoke(obj)

    • 注:可以向下转型obj,但是没有必要,因为要用反射的机制来调用方法,反射才有价值。如果将obj向下转型,还是只能通过方法名来调用方法,这样如果我想调用另一个方法,只能通过修改方法名->修改源码的方式。而利用反射机制,只用修改外部文件(配置文件),将methodName 修改

反射原理

  • 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到
  • 加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为反射

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

反射相关主要类

  • java.lang.Class:代表一个类, Class对象表示某个类加载后在堆中的对象
  • java.lang.reflect.Method: 代表类的方法, Method对象表示某个类的方法
  • java.lang.reflect.Field: 代表类的成员变量,Field对象表示某个类的成员变量
  • java.ang.reflect.Constructor: 代表类的构造方法,Constructor对象表示
    构造器

反射的优点和缺点及其优化

  • 优点: 可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
  • 缺点: 使用反射基本是解释执行,对执行速度有影响
  • 反射调用优化-关闭访问检查
    1. Method和Field、Constructor对象都有setAccessible()方法
    2. setAccessible作用是启动和禁用访问安全检查的开关
    3. 参数值为true表示反射的对象在使用时取消访问检查,提高反射的效率。参数值为false则表示反射的对象执行访问检查

Class类

  • Class也是类,因此也继承Object类
  • Class类对象不是new出来的,而是系统创建的
  • 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
  • 每个类的实例都会记得自己是由哪个 Class 实例所生成
  • 通过Class对象可以完整地得到一个类的完整结构,通过一系列API调用类的各部分
  • Class对象是存放在堆的
  • 类的字节码二进制数据,是放在方法区的, 有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)

Class类常用方法

方法名功能说明
static Class forName(String name)返回指定类名 name 的 Class 对象
Object newInstance()调用缺省构造函数,返回该Class对象的一个实例
getName()返回此Class对象所表示的实体(类、接口、数组类、基本类型等)名称
Class[ ]getlnterfaces()获取当前Class对象的接口
ClassLoader getClassLoader()返回该类的类加载器
Class getSuperclass()返回表示此Class所表示的实体的超类的Class
Constructor[ ] getConstructors()返回一个包含某些Constructor对象的数组
Field[ ] getDeclaredFields()返回Field对象(**成员属性)**的一个数组(注:不能直接获取私有属性)
Method getMethod (String name,class … paramTypes)返回一个Method对象,此对象的形参类型为paramType
  • 假设 cls 是某个对象对应的 Class 对象,则直接输出 cls 显示cls对象是哪个类的Class对象。输出cls.getClass()得到cls的运行类型 java.lang.Class

获取Class类对象的六种方式

  • 由于一个类只会加载一次,所以他们获取的都是同一个类对象(hashCode相同)
  1. 前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

    实例:Class cls1 Class.forName( "iava.lang.Cat” );
    应用场景:多用于配置文件,读取类全路径,加载类

  2. 前提:若已知具体的类,通过类的class 获取,该方式最为安全可靠,程序性能最高

    实例:Class cls2 = Cat.class;
    应用场景:多用于参数传递,比如通过反射得到对应构造器对象

  3. Class class = 对象.getClass(); 其实就是得到它的运行类型
    应用场景: 通过创建好的对象,获取Class对象
    前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象

  4. 其他方式
    ClassLoader cls = 对象.getClass().getClassLoader();
    Class class = cls.loadClass(“类的全类名”);

  5. 基本数据类型(int, char,boolean,float,double,byte,long,short)按如下方式得到Class类
    Class cls = 基本数据类型.class

  6. 基本数据类型对应的包装类,可以通过.TYPE 得到Class类对象
    Class cls = 包装类.TYPE

有Class对象的类型

  • 外部类,成员内部类,静态内部类,局部内部类,匿名内部类
  • interface:接口
  • 数组
  • enum:枚举
  • annotation:注解
  • 基本数据类型
  • void

类加载

动态加载和静态加载

  • 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。

  • 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强

  • 动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,也不报错,降低了依赖性

类加载时机

  • 当创建对象时(new) //静态加载
  • 当子类被加载时,父类也加载 //静态加载
  • 调用类中的静态成员时 //静态加载
  • 通过反射 //动态加载

类加载流程图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类加载五个阶段

加载阶段

  • JVM 在该阶段的主要目的是将字节码从不同的数据源(可能是 class 文件、也可能是jar 包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class 对象

连接阶段-验证

  • 目的是为了确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
  • 包括:文件格式验证(是否以魔数 oxcafebabe开头)、元数据验证、字节码验证和符号引用验证
  • 可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,,缩短虚拟机类加载的时间

连接阶段-准备

  • JVM 会在该阶段对静态变量,分配内存并默认初始化(对应数据类型的默认初始值,(如 0、0L、null、false 等)。这些变量所使用的内存都将在方法区中进行分配
class A{
//属性-成员变量-字段
//分析类加载的链接阶段-准备 属性是如何处理
//1.n1 是实例属性,不是静态变量,因此在准备阶段,是不会分配内存
//2.n2 是静态变量,分配内存n2是默认初始化 0,而不是20
//3.n3 是static final 是常量,他和静态变量不一样,因为一旦赋值就不变 n3 = 30
public int n1 = 10;
public static int n2 = 20;
int n3 = 3;
public static final int n3 = 30;
}

连接阶段-解析

  • 虚拟机将常量池内的符号引用替换为直接引用的过程

假设有一个类 MyClass,它有一个字段 field 和一个方法 method。在类文件中,这两个成员都会以符号引用的形式存在,例如:

  • 字段的符号引用:MyClass/field
  • 方法的符号引用:MyClass/method

当虚拟机加载 MyClass 并解析这些符号引用时,它会执行以下步骤:

  1. 加载:虚拟机加载 MyClass 类文件,并创建一个运行时常量池。
  2. 解析字段:虚拟机查找 MyClass 的字段 field,并计算出其在内存中的实际地址。
  3. 解析方法:虚拟机查找 MyClass 的方法 method,并计算出其在内存中的入口点。

最终,虚拟机会用实际的内存地址或偏移量来替换符号引用,使得字节码指令可以直接访问这些字段或调用这些方法。

总结

简单来说,符号引用是类文件中的抽象表示,而直接引用是虚拟机内部使用的具体引用。虚拟机在加载类时会解析这些符号引用,以便程序能够正确地访问类的方法和字段。这一过程保证了程序的可移植性和安全性。

Initialization(初始化)

  • 到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行<clinit>() 方法的过程。
  • <clinit>()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并。
  • 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。正因为有这个机制,才能保证某个类在内存中,只有一份Class对象

通过反射获取类的结构信息

java.lang.Class类

  1. getName:获取全类名
  2. getSimpleName:获取简单类名
  3. getFields:获取所有public修饰的属性,包含本类以及父类的(父类的父类等等也可以,下面同)
  4. getDeclaredFields:获取本类中所有属性
  5. getMethods:获取所有public修饰的方法,包含本类以及父类的
  6. getDeclaredMethods:获取本类中所有方法
  7. getConstructors: 获取所有public修饰的构造器,包含本类,不包含父类
  8. getDeclaredConstructors:获取本类中所有构造器
  9. getPackage:以Package形式返回包信息
  10. getsuperClass:以Class形式返回父类信息
  11. getlnterfaces:以Class[]形式返回接口信息
  12. getAnnotations:以Annotation[] 形式返回注解信息

java.lang.reflect.Field 类(属性相关)

  1. getModifiers:以int形式返回修饰符

    [说明: 默认修饰符 是0, public 是1,private是2,protected 是4,static是8,final是16]

    若为 public static 之类,则两个int值相加

  2. getType:以Class形式返回类型

  3. getName:返回属性名

java.lang.reflect.Method类(方法相关)

  1. getModifiers:以int形式返回修饰符
    [说明: 默认修饰符 是0, public 是1,private 是2,protected 是 4, static是8,final是16]
  2. getReturnType:以Class形式获取 返回类型
  3. getName:返回方法名
  4. getParameterTypes:以 Class[ ] 返回参数类型数组,无参则不返回

java.lang.reflect.Constructor类(构造器相关)

  1. getModifiers: 以int形式返回修饰符

    [说明: 默认修饰符 是0, public 是1,private 是2,protected 是 4, static是8,final是16]

  2. getName:返回构造器名(全类名)

  3. getParameterTypes:以Class[ ] 返回参数类型数组

反射暴破及实例

总结:Decalared获取私有内容的对象,暴破setAccessible使用私有内容的对象

可以暴破:构造器、属性、方法的对象,类的(Class)对象不能暴破

setAccessible 是 Java 反射 API 中的一个方法,它用于控制反射对象(如类、构造函数、方法和字段)的访问权限。通过调用 setAccessible 方法,可以改变 Java 语言访问控制的限制,允许程序访问原本不可见的私有成员。

作用

setAccessible 的主要作用如下:

  1. 访问私有成员:通过设置 Accessible 属性为 true,可以使程序能够访问类的私有成员,如私有字段或私有方法。
  2. 绕过访问控制:这使得程序能够在运行时动态地访问和修改类的私有成员,即使这些成员在源代码中被声明为 private、protected 或包私有。

创建对象

  • 方式一:调用类中的public修饰的无参构造器
  • 方式二: 调用类中的指定构造器
  • Class类相关方法
    • newlnstance :调用类中的无参构造器,获取对应类的对象
    • getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象
    • getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的所有构造器对象
  • Constructor类相关方法
    • setAccessible:暴破
    • newlnstance(Object…obj):调用构造器
public class ReflecCreateInstance {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //1. 先获取到User类的Class对象
        Class<?> userClass = Class.forName("com.hspedu.reflection.User");
        //2. 通过public的无参构造器创建实例
        Object o = userClass.newInstance();
        System.out.println(o);
        //3. 通过public的有参构造器创建实例
        /*
            constructor 对象就是
            public User(String name) {//public的有参构造器
                this.name = name;
            }
         */
        //3.1 先得到对应构造器
        Constructor<?> constructor = userClass.getConstructor(String.class);
        //3.2 创建实例,并传入实参
        Object hsp = constructor.newInstance("hsp");
        System.out.println("hsp=" + hsp);
        //4. 通过非public的有参构造器创建实例
        //4.1 得到private的构造器对象
        Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
        //4.2 创建实例
        //暴破【暴力破解】 , 使用反射可以访问private构造器/方法/属性, 反射面前,都是纸老虎
        constructor1.setAccessible(true);
        Object user2 = constructor1.newInstance(100, "张三丰");
        System.out.println("user2=" + user2);
    }
}

class User { //User类
    private int age = 10;
    private String name = "韩顺平教育";

    public User() {//无参 public
    }

    public User(String name) {//public的有参构造器
        this.name = name;
    }

    private User(int age, String name) {//private 有参构造器
        this.age = age;
        this.name = name;
    }

    public String toString() {
        return "User [age=" + age + ", name=" + name + "]";
    }
}

访问属性

  • 根据属性名获取Field对象(Declared可以获取私有属性)
    Field f= clazz对象.getDeclaredField(属性名);
  • 暴破: f.setAccesgible(true); //f 是Field
  • 访问
    f.set(o,值);
    syso(f.get(o));
    如果是静态属性,则set和get中的参数o,可以写成null
public class ReflecAccessProperty {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {

        //1. 得到Student类对应的 Class对象
        Class<?> stuClass = Class.forName("com.hspedu.reflection.Student");
        //2. 创建对象
        Object o = stuClass.newInstance();//o 的运行类型就是Student
        System.out.println(o.getClass());//Student
        //3. 使用反射得到age 属性对象
        Field age = stuClass.getField("age");
        age.set(o, 88);//通过反射来操作属性
        System.out.println(o);//
        System.out.println(age.get(o));//返回age属性的值

        //4. 使用反射操作name 属性
        Field name = stuClass.getDeclaredField("name");
        //对name 进行暴破, 可以操作private 属性
        name.setAccessible(true);
        //name.set(o, "老韩");
        name.set(null, "老韩~");//因为name是static属性,因此 o 也可以写出null
        System.out.println(o);
        System.out.println(name.get(o)); //获取属性值
        System.out.println(name.get(null));//获取属性值, 要求name是static

    }
}

class Student {//类
    public int age;
    private static String name;

    public Student() {//构造器
    }

    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }
}

访问方法

  • 根据方法名和参数列表获取Method方法对象:

    Method m=clazz.getDeclaredMethod(方法名,XX.class);//得到本类的所有方法

  • 获取对象:Object o=clazz.newlnstance();

  • 暴破:m.setAccessible(true);

  • 访问:Object returnValue = m.invoke(o,实参列表);

  • 注意:如果是静态方法,则invoke的参数o,可以写成null

public class ReflecAccessMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {

        //1. 得到Boss类对应的Class对象
        Class<?> bossCls = Class.forName("com.hspedu.reflection.Boss");
        //2. 创建对象
        Object o = bossCls.newInstance();
        //3. 调用public的hi方法
        //Method hi = bossCls.getMethod("hi", String.class);//OK
        //3.1 得到hi方法对象
        Method hi = bossCls.getDeclaredMethod("hi", String.class);//OK
        //3.2 调用
        hi.invoke(o, "韩顺平教育~");

        //4. 调用private static 方法
        //4.1 得到 say 方法对象
        Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);
        //4.2 因为say方法是private, 所以需要暴破,原理和前面讲的构造器和属性一样
        say.setAccessible(true);
        System.out.println(say.invoke(o, 100, "张三", '男'));
        //4.3 因为say方法是static的,还可以这样调用 ,可以传入null
        System.out.println(say.invoke(null, 200, "李四", '女'));

        //5. 在反射中,如果方法有返回值,统一返回Object , 但是他运行类型和方法定义的返回类型一致
        Object reVal = say.invoke(null, 300, "王五", '男');
        System.out.println("reVal 的运行类型=" + reVal.getClass());//String


        //在演示一个返回的案例
        Method m1 = bossCls.getDeclaredMethod("m1");
        Object reVal2 = m1.invoke(o);
        System.out.println("reVal2的运行类型=" + reVal2.getClass());//Monster


    }
}

class Monster {}
class Boss {//类
    public int age;
    private static String name;

    public Boss() {//构造器
    }

    public Monster m1() {
        return new Monster();
    }

    private static String say(int n, String s, char c) {//静态方法
        return n + " " + s + " " + c;
    }

    public void hi(String s) {//普通public方法
        System.out.println("hi " + s);
    }
}
【Java实战】Java实现坦克大战(韩顺平版) 该坦克大战运用了JavaGUI图形库,多线程,文件IO,反射等Java高级编程中的知识,用来巩固Java语法非常合适。我在韩老师原版的设计上做了一些改变,敌方坦克会永远保持三个,你每杀死一辆敌方坦克,并会在屏幕内随机生成一个敌方坦克以此来增加游戏乐趣,其他内容与原版无异。下面是展示图:该项目总共九个类,包含近1000行代码。 阅读详情

相关推荐

韩顺平Java自学笔记 反射

自己做的一些学习笔记,随时更新内容。

m0_67946241的博客 525

【韩顺平讲Java】Java反射专题(一)

反射是框架的底层基石,对阅读框架底层源码有帮助 先提出一个需求: 1.根据配置文件 re.properties指定信息,创建对象并调用方法 classfullpath=com.hspedu.Cat method=hi ●老韩思考:使用现有技术,你能做的吗? 2.这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下,来控制程序,也符合设计模式的ocp原则(开闭原则,即不修改源码,来扩展功能) 3.快速入门com.hspedu.reflection.question ReflectionQue

想握住此生辽阔 1578

韩顺平Java编程完全手册

Java语言是一种静态类型语言,这意味着所有的变量在使用之前都必须声明其类型。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。基本数据类型包括数值类型(整型、浮点型)、字符类型(字符型)和布尔类型。这些类型的数据直接存储在栈中,它们的值直接表示数据本身,而不是指向数据的引用。整型:包括byte、short、int和long四种类型,它们分别占用8、16、32和64位的空间。浮点型:包括float和double两种类型,分别表示单精度和双精度浮点数。字符型。

weixin_30838971的博客 1120

B站韩顺平java学习笔记(二十二)-- 反射 章节

一 反射机制 二 Class类 三 类加载 四 反射获取类的结构信息 五 反射相关类 六 反射调用性能优化 七 Class类常用方法

LW_20180806的博客 2393

《Java大师韩顺平经典讲解:从入门到精通》课程全解析

Java是一种广泛使用的面向对象的编程语言,因其平台无关性、安全性、多线程支持和跨平台特性而闻名。Java代码经过编译后形成字节码,可以在安装了Java虚拟机(JVM)的任何操作系统上运行。在实际开发中,常常需要自定义异常类来处理特定的错误情况。自定义异常类应当继承自Exception(检查型异常)或(非检查型异常),以符合异常分类的要求。例如:自定义异常类应当包含必要的构造函数,以提供异常信息。

weixin_33068055的博客 606

基于STM32的超声波流量计设计

本项目基于STM32微控制器设计了一种超声波流量计,采用时间差法测量液体或气体的流速,计算流量并通过显示屏实时显示,同时支持远程数据传输。本设计通过STM32微控制器实现了基于时间差法的超声波流量计,集成了超声波信号采集、流量计算、状态显示和远程通信功能。本系统需要实现超声波信号的实时采集与处理,计算流速和流量,并将数据通过OLED显示和无线模块上传。系统需具备高精度的时间测量能力和良好的抗干扰能力。通过计算超声波在顺流和逆流方向上的传播时间差,结合管道直径与流体特性,计算流速并进一步计算流量。

stm32d1219的博客 2348

【韩顺平】Java反射机制笔记

文章目录1、前言2、一个需求引出反射3、反射机制3.1 Java Reflection3.2 反射机制原理图3.3 反射机制可以完成的功能3.4 反射相关的主要类3.5 反射的优点和缺点3.6 反射调用优化——关闭访问检查4、Class对象4.1 基本介绍4.2 Class类的常用方法4.3 应用实例5、获取Class对象6、哪些类型有Class对象6.1 如下类型有Class对象6.2 应用实例7、类加载7.1 基本说明7.2 类加载时机7.3 类加载过程图7.4 类加载各个阶段完成任务7.5 加载阶段7

保持学习 2541

手把手教你逆向分析某里系bx-ua参数(以225版本为例)

本文详细解析了某里系应用bx-ua参数的逆向工程实战方法,重点拆解其三层加密体系(二进制加密、字符替换和Base64编码)。通过工具链配置和实战案例,帮助开发者掌握逆向分析技巧,适用于合法合规的安全研究和加密技术评估场景。

weixin_33220360的博客 412

韩顺平java—反射

(1)Class也是类,因此也继承Object类(2)Class类对象不是new出来的,而是系统创建的。通过类加载器ClassLoader.loadclass完成类加载,生成某个类对应的Class类对象(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次(某个类的类对象只有一个)(4)每个类的实例都会记得自己是由哪个Class实例所生成。比如分别new了一个Cat,其对象实例会关联对应的Class对象,如图所示//2.Class类对象不是new出来的,而是系统创建的。

weixin_47095832的博客 1192

Zigbee开发环境搭建:从驱动安装到程序烧录全指南

本文提供了一份详尽的Zigbee开发环境搭建全指南,涵盖从驱动安装到程序烧录的完整流程。重点介绍了使用SmartRF Flash Programmer和仿真器进行程序下载的关键步骤,并详细说明了USB转串口驱动的配置方法,帮助开发者快速构建稳定的Zigbee开发基础。

weixin_29195217的博客 394

C#实战:手把手教你用SerialPort实现RS485 ModbusRTU通信(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现RS485 ModbusRTU通信,包括硬件准备、串口配置、数据收发核心逻辑及高级通信技巧。通过实战案例和完整代码,帮助开发者快速掌握工业级通信框架的构建方法,提升设备间通信的稳定性和效率。

weixin_29207533的博客 255

【韩顺平老师Java反射笔记】

1.反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息(化比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射。//得到本类的所有方法。2.加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),[说明:默认修饰符是0,public是1,private是2,protected是4,[说明:默认修饰符是0,public是1,private是2,protected是4,

西洼工作室的博客 1077

MMSegmentation 安装教程,避免mmcv不合适版本,及相关问题解决

都行,不做要求。

qq_43683133的博客 1219

韩顺平教育java高级课程

如何实现“韩顺平教育java高级课程” 作为一名经验丰富的开发者,我很高兴能够帮助刚入行的小白实现“韩顺平教育java高级课程”。在这个过程中,我会详细介绍整个实现流程,并提供代码示例和注释,以确保你能够理解并掌握每个步骤。 实现流程 首先,让我们通过一个表格来了解实现“韩顺平教育java高级课程”的整个流程: 步骤...

weixin_41574285的博客 867

YOLOv13改进:卷积魔改 | 动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点

如何跟YOLOv13结合:替代YOLOv13的DS-C3K2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 364

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景

摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。

分享顶会顶刊论文即插即用模块 301

韩顺平Java | C23 反射Reflection

需求:通过外部文件配置,在不修改源码情况下控制程序(符合设计模式ocp开闭原则:不修改源码的情况下扩容功能)

媛媛 1034

【CANoe】CANoe的 I/O功能-以VN1640A为例

Canoe的 I/O功能-以VN1640A为例

星Yeah 的博客 7875

韩顺平Java从入门到精通教学PPT:助力Java学习之路

韩顺平Java从入门到精通教学PPT:助力Java学习之路 【下载地址】韩顺平Java从入门到精通教学PPT 这套由知名Java讲师韩顺平精心制作的Java教学PPT,涵盖了从入门到精通的全面知识点,适合初学者和进阶者使用。内容详实、步骤清晰,帮助用户深入理解Java编程的基础与高级特性。无论你是刚接触Java,还是希望...

gitblog_06729的博客 1064

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

非零基础自学Java (老师:韩顺平) 第23章 反射(reflection) 23.2 反射机制

非零基础自学Java (老师:韩顺平) 第23章 反射(reflection) 23.2 反射机制

代码改变世界 451

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【韩顺平讲Java】Java反射专题(二)

动态和静态加载 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。 1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强 2.动态加载:运行时加载需要的类,如果运行时不用该类,则不报错,降低了依赖性 类加载时机 1.当创建对象时(new) 2.当子类被加载时,父类也加载(是静态加载,因为有继承关系) 3.调用类中的静态成员时(是静态加载) 4.通过反射(动态加载) 静态加载:编译的时候就会加载这个类(检查类是否正确、依赖关系、父类是否ok等等),比如下面这段代码 用户可能输入1,

想握住此生辽阔 1330

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

韩顺平 2021零基础学Java 学习笔记(4)(自用)

目录第 21 章 网络编程第 23 章 反射(reflection)第 24 章 零基础学 MySQL 第 21 章 网络编程 21.1 网络的相关概念 21.1.1 网络通信 21.1.2 网络 21.1.3 ip 地址 21.1.4 ipv4 地址分类 21.1.5 域名 21.1.6 网络通信协议 21.1.8 TCP 和 UDP 21.2 InetAddress 类 package com.hspedu.api; import java.net.InetAddress; imp

weixin_43973189的博客 8213

非零基础自学Java (老师:韩顺平) 第23章 反射(reflection) 23.7 通过反射获取类的结构信息

非零基础自学Java (老师:韩顺平) 第23章 反射(reflection) 23.7 通过反射获取类的结构信息

代码改变世界 455

【反射2】——Java基础(韩顺平讲解)

1、Class也是类,因此也继承Object类4、每个类的实例都会记得自己是由哪个Class实例所生成5、通过Class对象可以完整地得到一个类的完整结构,通过一系列API6、Class对象是存放在堆的7、类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等)

m0_46459413的博客 1313

韩顺平反射笔记

反射

未来的博客 554
上一篇: 【Java】韩顺平Java学习笔记 第22章 多用户通讯系统
下一篇: 【Java】 Java 8 新特性笔记
COTAS
博客等级 码龄7年 369粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值