看了Java的Class的源码,我自闭了

蓝桥杯Java备赛核心指南:环境配置、IO优化与算法思维 Java算法竞赛并非单纯考察代码能力,而是综合检验开发环境适配性、标准输入输出性能及底层计算思维。理解JDK版本兼容性(如JDK 17的--release编译参数)、规避Scanner阻塞风险、掌握BufferedReader高效读取原理,是通过评测机的第一道门槛;在此基础上,动态规划、双指针、二分贪心等算法需结合数据规模进行复杂度降维。本文聚焦蓝桥杯Java组真实评测场景,深入解析java环境变量配置、java: 错误: 不支持发行版本 5等高频报错根因,并提供可复用的工业级IO模板与状态压缩解法,助力选 阅读详情

1.class这个类是什么

Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一般的类,接口,枚举类型,注解类型等等。这么说可能有点太理论,我们看下面这个例子:

我们将生活中的一类事物抽象为一个类的时候,往往是因为他们具有相同的共性和不同的个性。定义一个类的作用就是将相同的共性抽离出来。一般的类都包含属性和方法(行为),下面我们定义水果和汽车这两个大类:威xuanwo013

 

 

代码如下:

汽车类:

威xuanwo013 获取java学习手册及架构学习文档
class Car{

    // 定义属性
    private String name;
    private String color;

    /**
     * 定义两个构造方法
     */
    public Car(){

    }

    public Car(String name,String color){
        this.name = name;
        this.color = color;
    }

    /**
     * 定义两个普通方法(行为)
     */
    public void use(){

    }

    public void run(){

    }

    /**
     * 属性的get和set方法
     * @return
     */
    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
         this.color = color;
    }
}

水果类:

class Fruit{

    // 定义属性
    private String name;
    private int size;

    /**
     * 定义两个构造方法
     */
    public Fruit(){

    }

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

    /**
     * 定义两个方法(行为)
     */
    public void use(){

    }

    public void doFruit(){

    }

    /**
     * 属性的get和set方法
     * @return
     */
    public String getName() {
        return name;
    }

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

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

可以看到水果和汽车这两个类都有共同的部分,也就是一个类共同的部分,那就是属性和方法,而Class就是来操作我们定义类的属性和方法。

 

 

​小试牛刀:通过Class这个类来获取Fruit这个类中定义的方法;

public static void main(String[] args) {

        Fruit fruit = new Fruit();
        Class fruitClass = fruit.getClass();

        Method[] fruitMethods = fruitClass.getMethods();
        System.out.println("方法个数:" + fruitMethods.length);

        for (Method method : fruitMethods) {
            //得到返回类型
            System.out.print("方法名称和参数:" + method.getName() + "(");
            //取得某个方法对应的参数类型数组
            Class[] paramsType = method.getParameterTypes();
            for (Class paramType : paramsType) {
                System.out.print(paramType.getTypeName() + " ");
            }
            System.out.print(")");

            Class returnType = method.getReturnType();
            System.out.println("返回类型:" + returnType.getTypeName());
        }
    }

运行结果:

方法个数:15
方法名称和参数:getName()返回类型:java.lang.String
方法名称和参数:setName(java.lang.String )返回类型:void
方法名称和参数:getSize()返回类型:int
方法名称和参数:setSize(int )返回类型:void
方法名称和参数:use()返回类型:void
方法名称和参数:doFruit()返回类型:void
方法名称和参数:wait()返回类型:void
方法名称和参数:wait(long int )返回类型:void
方法名称和参数:wait(long )返回类型:void
方法名称和参数:equals(java.lang.Object )返回类型:boolean
方法名称和参数:toString()返回类型:java.lang.String
方法名称和参数:hashCode()返回类型:int
方法名称和参数:getClass()返回类型:java.lang.Class
方法名称和参数:notify()返回类型:void
方法名称和参数:notifyAll()返回类型:void

这里可能有人疑惑了,Fruit类并没有定义的方法为什么会出现,如wait(),equals()方法等。这里就有必要说一下java的继承和反射机制。在继承时,java规定每个类默认继承Object这个类,上述这些并没有在Fruit中定义的方法,都是Object中的方法,我们看一下Object这个类的源码就会一清二楚:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

 public final native void wait(long timeout) throws InterruptedException;

 public final void wait() throws InterruptedException {
        wait(0);
    }

而Class类中的getMethods()方法默认会获取父类中的公有方法,也就是public修饰的方法。所以Object中的公共方法也出现了。

注: 要想获得父类的所有方法(public、protected、default、private),可以使用apache commons包下的FieldUtils.getAllFields()可以获取类和父类的所有(public、protected、default、private)属性。

是不是感觉非常的强大 ,当然,使用Class来获取一些类的方法和属性的核心思想就是利用了Java反射特性。万物皆反射,可见反射的强大之处,至于反射的原理,期待我的下一个博客。

2.常用方法的使用以及源码分析

2.1构造方法

源码如下:

 private Class(ClassLoader loader) {
        // Initialize final field for classLoader.  The initialization value of non-null
        // prevents future JIT optimizations from assuming this final field is null.
        classLoader = loader;
    }

可以看到Class类只有一个构造函数,并且是私有的。也就是说不能通过new来创建这个类的实例。官方文档的解释:私有构造函数,仅Java虚拟机创建Class对象。我想可能就是为了安全,具体原因不是很了解。如果有了解的话,可以在评论区内共同的交流。

Class是怎么获取一个实例的。

那么既然这个class构造器私有化,那我们该如何去构造一个class实例呢,一般采用下面三种方式:

1.运用.class的方式来获取Class实例。对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例,如下的示例。

 // 普通类获取Class的实例。接口,枚举,注解,都可以通过这样的方式进行获得Class实例
Class fruitClass = Fruit.class;

// 基本类型和封装类型获得Class实例的方式,两者等效的
Class intClass = int.class;
Class intClass1 = Integer.TYPE;

下面的表格两边等价:

boolean.classBoolean.TYPEchar.classCharacter.TYPEbyte.classByte.TYPEshort.classShort.TYPEint.classInteger.TYPElong.classLong.TYPEfloat.classFloat.TYPEdouble.classDouble.TYPEvoid.classVoid.TYPE

但是这种方式有一个不足就是对于未知的类,或者说不可见的类是不能获取到其Class对象的。

2.利用对象.getClass()方法获取该对象的Class实例;

这是利用了Object提供的一个方法getClass() 来获取当着实例的Class对象,这种方式是开发中用的最多的方式,同样,它也不能获取到未知的类,比如说某个接口的实现类的Class对象。

Object类中的getClass()的源码如下:

public final native Class<?> getClass();

源码说明:

可以看到,这是一个native方法(一个Native Method就是一个java调用非java代码的接口),并且不允许子类重写,所以理论上所有类型的实例都具有同一个 getClass 方法。

使用:

 Fruit fruit = new Fruit();
 Class fruitClass = fruit.getClass();

3.使用Class类的静态方法forName(),用类的名字获取一个Class实例(static Class forName(String className) ),这种方式灵活性最高,根据类的字符串全名即可获取Class实例,可以动态加载类,框架设计经常用到;

源码如下:

    /*
     由于方法区 Class 类型信息由类加载器和类全限定名唯一确定,所以参数name必须是全限定名,
     参数说明   name:class名,initialize是否加载static块,loader 类加载器
     */
    public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)
        throws ClassNotFoundException
    {
        Class<?> caller = null;

        // 1.进行安全检查
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
           ....
            }
        }
        // 2.调用本地的方法
        return forName0(name, initialize, loader, caller);
    }

    // 3.核心的方法
    private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)
      throws ClassNotFoundException;

   /* 
    这个 forName是上述方法的重载,平时一般都使用这个 方法默认使用调用者的类加载器,将类的.class文件加载     到 jvm中
    这里传入的initialize为true,会去执行类中的static块
    */
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }

源码说明已在注释中说明,有些人会疑惑, static native Class<?> forName0()这个方法的实现。

这就要说到java的不完美的地方了,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。有关native的方法请移步这里。

基本使用:

Class fruitClass = Class.forName("cn.chen.test.util.lang.Fruit");

注: 这种方式必须使用类的全限定名,,这是因为由于方法区 Class 类型信息由类加载器和类全限定名唯一确定,否则会抛出ClassNotFoundException的异常。

2.2一般方法以及源码分析:

Class类的一般的方法总共有六十多种,其实看到这么多方法咱也不要怂,这里面还有很多重载的方法,根据二八原则,我们平时用的也就那么几个方法,所以这里只对以下几个方法的使用和实现进行交流,其他的方法可以移步Java官方文档:

 

2.2.1 获得类的构造方法

这个方法主要是用来了解一个类的构造方法有哪些,包含哪些参数,特别是在单例的模式下。一般包含的方法如下:

  • public Constructor[] getConstructors() :获取类对象的所有可见的构造函数
  • public Constructor[] getDeclaredConstructors():获取类对象的所有的构造函数
  • public Constructor getConstructor(Class... parameterTypes): 获取指定的可见的构造函数,参数为:指定构造函数的参数类型数组,如果该构造函数不可见或不存在,会抛出 NoSuchMethodException 异常
  • public Constructor getDeclaredConstructor(Class... parameterTypes) :获取指定的构造函数,参数为:指定构造函数的参数类型数组,无论构造函数可见性如何,均可获取

基本使用:

Constructor[] constructors = fruitClass.getConstructors();
 for (Constructor constructor : constructors) {
            System.out.println("获得共有的构造方法:"+constructor);
        }

输出结果:

获得共有的构造方法:public cn.chen.test.util.lang.Fruit()
获得共有的构造方法:public cn.chen.test.util.lang.Fruit(java.lang.String,int)

可以看到我们前面定义的来个构造方法,都被打印出来了。注意getConstructors()只能获得被public修饰的构造方法,如果要获得被(protected,default,private)修饰的构造方法,就要使用的getDeclaredConstructors()这个方法了。接下来,修改Fruit中的一个构造方法为private:

 private  Fruit(String name,int size){
        this.name = name;
        this.size =size;
    }

使用getConstructors()和getDeclaredConstructors()这两个方法进行测试:

       Class fruitClass = Fruit.class;       
       Constructor[] constructors = fruitClass.getConstructors();
       Constructor[] constructors1 = fruitClass.getDeclaredConstructors();

        for (Constructor constructor : constructors) {
            System.out.println("获得共有的构造方法:"+constructor);
        }

        System.out.println("=================================================");
        for (Constructor constructor : constructors1) {
            System.out.println("获得所有的构造方法:"+constructor);
        }

输出结果:

获得共有的构造方法:public cn.chen.test.util.lang.Fruit()
===================分隔线=============================
获得所有的构造方法:public cn.chen.test.util.lang.Fruit()
获得所有的构造方法:private cn.chen.test.util.lang.Fruit(java.lang.String,int)

可以看到两者的区别。所以,反射在一定程度上破坏了java的封装特性。毕竟人无完人,语言亦是一样。

getConstructors()的源码分析:

public Constructor<?>[] getConstructors() throws SecurityException {

        // 1.检查是否允许访问。如果访问被拒绝,则抛出SecurityException。
        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
        return copyConstructors(privateGetDeclaredConstructors(true));
    }

 private static <U> Constructor<U>[] copyConstructors(Constructor<U>[] arg) {
      // 2.使用克隆,得到当前类的所有构造函数   
      Constructor<U>[] out = arg.clone();
     // 3.使用ReflectionFactory构造一个对象,也是不使用构造方法构造对象的一种方式。
        ReflectionFactory fact = getReflectionFactory();
     // 4.遍历,将构造函数进行拷贝返回,注意在调用fact.copyConstructor(out[i])这个方法的时候,还会进行安全检查,用的就是下面的LangReflectAccess() 这个方法。
        for (int i = 0; i < out.length; i++) {
            out[i] = fact.copyConstructor(out[i]);
        }
        return out;
    }

 private static LangReflectAccess langReflectAccess() {
        if (langReflectAccess == null) {
            Modifier.isPublic(1);
        }

        return langReflectAccess;
    } 

通过打断点调试,可以看到下面的信息:

 

代码的调用逻辑在注释里已进行说明。

2.2.2 获得属性

主要获取类的属性字段,了解这个类声明了那些字段。

一般有四个方法:

  • public Field[] getFields():获取所有可见的字段信息,Field数组为类中声明的每一个字段保存一个Field 实例
  • public Field[] getDeclaredFields():获取所有的字段信息
  • public Field getField(String name) :通过字段名称获取字符信息,该字段必须可见,否则抛出异常
  • public Field getDeclaredField(String name) :通过字段名称获取可见的字符信息

基本使用:

首先我们在Fruit的类中加入一个public修饰的属性:

    public double weight;
Class fruitClass = Fruit.class; 
Field[] field2 = fruitClass.getFields();
        for (Field field : field2) {
            System.out.println("定义的公有属性:"+field);
        }

        Field[] fields = fruitClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("定义的所有属性:"+field);
        }

输出结果:

定义的公有属性:public double cn.chen.test.util.lang.Fruit.weight
========================分隔线============================
定义的所有属性:private java.lang.String cn.chen.test.util.lang.Fruit.name
定义的所有属性:private int cn.chen.test.util.lang.Fruit.size
定义的所有属性:public double cn.chen.test.util.lang.Fruit.weight

源码分析,就以getFileds()这个方法为例,涉及以下几个方法:

public Field[] getFields() throws SecurityException {
        // 1.检查是否允许访问。如果访问被拒绝,则抛出SecurityException。
        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
        return copyFields(privateGetPublicFields(null));
    }

 private static Field[] copyFields(Field[] arg) {
         // 2\. 声明一个Filed的数组,用来存储类的字段 
        Field[] out = new Field[arg.length];
        //  3.使用ReflectionFactory构造一个对象,也是不使用构造方法构造对象的一种方式。
        ReflectionFactory fact = getReflectionFactory();
       // 4.遍历,将字段复制后返回。
        for (int i = 0; i < arg.length; i++) {
            out[i] = fact.copyField(arg[i]);
        }
        return out;
    }

 public Field copyField(Field var1) {
        return langReflectAccess().copyField(var1);
    }

// 再次检查属性的访问权限
  private static LangReflectAccess langReflectAccess() {
        if (langReflectAccess == null) {
            Modifier.isPublic(1);
        }

        return langReflectAccess;
    }

2.2.3 获得一般方法

就是获取一个类中的方法,一般有以下几个方法:

  • public Method[] getMethods(): 获取所有可见的方法
  • public Method[] getDeclaredMethods() :获取所有的方法,无论是否可见
  • public Method getMethod(String name, Class... parameterTypes)参数说明:
  1. 通过方法名称、参数类型获取方法
  2. 如果你想访问的方法不可见,会抛出异常
  3. 如果你想访问的方法没有参数,传递 null作为参数类型数组,或者不传值)
  • public Method getDeclaredMethod(String name, Class... parameterTypes)
  1. 通过方法名称、参数类型获取方法
  2. 如果你想访问的方法没有参数,传递 null作为参数类型数组,或者不传值)

基本使用:

//在fruit中定义一个这样的方法
 private  void eat(String describe){
        System.out.println("通过getMethod()方法调用了eat()方法:  "+describe);
    }

调用这个方法:

        Class fruitClass = Fruit.class;
        Method method = fruitClass.getDeclaredMethod("eat",String.class);
        method.setAccessible(true);
        method.invoke(fruitClass.newInstance(),"我是该方法的参数值");

输出结果:

  通过getMethod()方法调用了eat()方法:我是该方法的参数值

分析getDeclaredMethod()涉及的源码:

public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
        throws NoSuchMethodException, SecurityException {
        // 1.检查方法的修饰符
        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
        // 2.searchMethods()方法的第一个参数确定这个方法是不是私有方法,第二个参数我们定义的方法名,第三个参数就是传入的方法的参数类型
        Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
        if (method == null) {
            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
        }
        return method;
    }

// 这个方法就是通过传入的方法名找到我们定义的方法,然后使用了Method的copy()方法返回一个Method的实例,我们通过操作mehtod这个实例就可以操作我们定义的方法。
 private static Method searchMethods(Method[] methods,
                                        String name,
                                        Class<?>[] parameterTypes)
    {
        Method res = null;
        String internedName = name.intern();
        for (int i = 0; i < methods.length; i++) {
            Method m = methods[i];
            if (m.getName() == internedName
                && arrayContentsEq(parameterTypes, m.getParameterTypes())
                && (res == null
                    || res.getReturnType().isAssignableFrom(m.getReturnType())))
                res = m;
        }

        return (res == null ? res : getReflectionFactory().copyMethod(res));
    }

 public Method copyMethod(Method var1) {
        return langReflectAccess().copyMethod(var1);
    }

// 检查属性的访问权限
  private static LangReflectAccess langReflectAccess() {
        if (langReflectAccess == null) {
            Modifier.isPublic(1);
        }

        return langReflectAccess;
    }

2.2.4 判断类的类型的方法

这类型的方法顾名思义,就是来判断这个类是什么类型,是接口,注解,枚举,还是一般的类等等。部分方法如下表

booleanisAnnotation()判断是不是注解booleanisArray() 判断是否为数组booleanisEnum()判断是否为枚举类型booleanisInterface() 是否为接口类型booleanisMemberClass()当且仅当基础类是成员类时,返回“true”booleanisPrimitive()确定指定的“类”对象是否表示原始类型。booleanisSynthetic()如果这个类是合成类,则返回' true ';否则返回“false”。

基本用法:

// 定义一个接口:
interface  Animal{
    public void run();
}

判断是不是一个接口:

Class AnimalClass = Animal.class;
 boolean flag = AnimalClass.isInterface();
 System.out.println(flag);

输出结果:

true

源码分析isInterface():

public native boolean isInterface();

这是一个native方法,大家都知道native方法是非Java语言实现的代码,供Java程序调用的,因为Java程序是运行在JVM虚拟机上面的,要想访问到比较底层的与操作系统相关的就没办法了,只能由靠近操作系统的语言来实现。

2.2.5 toString()方法

将对象转换为字符串。字符串表示形式是字符串“类”或“接口”,后跟一个空格,然后是该类的全限定名。

基本使用:

// 这是前面定义的两个类Fruit和Car,Car是一个接口
 Class fruitClass = Fruit.class;
 Class AnimalClass = Animal.class;
 System.out.println(AnimalClass.toString());
 System.out.println(fruitClass.toString());

输出结果:

// 格式  字符串“类”或“接口”,后跟一个空格,然后是该类的全限定名
interface cn.chen.test.util.lang.Animal
class cn.chen.test.util.lang.Fruit

 

源码如下:

 public String toString() {
       // 先是判断是接口或者类,然后调用getName输出类的全限定名
        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
            + getName();
    }

  public native boolean isInterface();
  public native boolean isPrimitive();

想要了解更多Java架构技术的,可以关注我一下,我后续也会整理更多关于架构技术这一块的知识点分享出来,里面会分享一些:spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化,并发编程这些成为架构师必备的知识体系.更多交流和获取方式可以私信博主

Java反序列化漏洞深度剖析:从XML-RPC到RCE的攻击链与防御实践 Java反序列化是一种将字节流还原为对象的核心机制,广泛应用于远程通信和数据持久化。其原理在于通过ObjectInputStream读取序列化数据,并调用对象的readObject方法重建对象实例。然而,当反序列化过程处理不可信数据时,攻击者可能构造恶意序列化对象(Gadget Chain),利用类路径中危险类的链式调用(如Apache Commons Collections中的Transformer),最终触发任意代码执行,实现远程命令执行(RCE)。这种漏洞在Web应用、RPC服务等场景中危害极大,常通 阅读详情

相关推荐

JB2-7-HTML

HTML结构(全局属性,实体符号),容器标签(p,div,blockquote,pre,section,article,aside,header,footer),文字标签(br,hr,span,h#,small,sup,sub,a),媒体标签(img,audio,video,figure),列表标签(ol,ul,dl),表格标签(table,tr,td,th,跨行,跨列,colgroup),表单标签(form,input,button,select,textarea)等。

周航宇的博客 1594

Class.forName底层原理

Class Class.forName public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException { Class<?> caller = null; SecurityManager sm =

kongkong的专栏 1396

深入解析高通Camx-CHI架构:从源码结构到实战调试与性能优化

相机硬件抽象层(HAL)是连接移动操作系统与相机硬件的关键中间件,其核心在于管理图像数据流与硬件资源。在安卓生态中,高通平台的Camx架构通过管道化与组件化设计,实现了高性能与高可扩展性,尤其支撑了多摄、计算摄影等复杂场景。其技术价值在于为OEM厂商提供了深度定制相机处理管线(如集成自定义3A算法、美颜滤镜)的能力,而CHI-CDK(Camera Hardware Interface Component Development Kit)正是实现这一目标的核心开发套件。开发者通过理解Pipeline、Node

weixin_33795806的博客 637

java基础-反射

概念 反向探知,探知以前的事情 指在java程序运行状态中 1.对于给定的一个类(Class)对象,可以获取 这个类Class对象的所有属性和方法; 2.对于给定的而一个对象,new XXXClassName<? extend Object> ,都能够调用它任意一个属性和方法; 这种动态获取类的内容以及动态调用对象的方法和获取属性的机制,就叫做JAVA的反射机制; 例子: public class User { private Long id; public..

qq_32363305的博客 290

PPO算法详解:基于CartPole-v1的强化学习实现

PPO算法详解:基于CartPole-v1的强化学习实现

m0_54720701的博客 866

深入解析Mifare Classic Crypto1认证流程与密钥交换机制

本文深入解析Mifare Classic Crypto1认证流程与密钥交换机制,详细介绍了Crypto1加密算法的工作原理、认证初始化阶段、随机数交换与密钥流生成过程,以及双向验证步骤。文章还分析了Mifare Classic的安全漏洞,包括随机数生成缺陷和密钥流恢复攻击,并提供了Proxmark3实战演示和防护建议。

c6d7e8f9g的博客 898

mysql的class.forname_浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

引言如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName("com.mysql.jdbc.Driver");public static Connection getConnection() throws ClassNotFoundException, SQLException {if(connection == null){Class.forNa...

weixin_29086203的博客 1132

今天出一个candence 17.4 allego的安装教程

7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。

hcvinh的博客 2727

java 反射

反射是什么? 通过非new的方式构造对象. 为什么需要反射? 只知道类名,其他啥也不知道的情况下构造对象 反射如何使用? public class Demo1 { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

鸭梨的博客 133

VirtualLab初学者教程-1.用户界面

目录前言一、VirtualLab Fusion简介1.软件2.内置工具箱:二、用户界面认识1.上方菜单栏2.右侧面主窗口3.底部窗口附 前言 感觉做VirtualLab的资料不是特别多,可能用的朋友也比较少吧,笔者最近也因为大创需要刚刚开始入门,把网上有的英文资料整理了一下,加了一点自己的内容发出来希望帮助更多在学习中的朋友,有用词不当之处还请多多包涵。 一、VirtualLab Fusion简介 因为是第一讲,简单啰嗦一下软件本身,参考官方介绍。 1.软件 VirtualLab是由德国LightTran

ClaireTang1的博客 2万+

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 307

理解java.lang.Class类

Java Class类理解: 首先,Class是一个java类,跟Java API中定义的诸如Thread、Integer类、我们自己定义的类是一样,也继承了Object(Class是Object的直接子类)。总之,必须明确一点,它其实只是个类,只不过名字比较特殊。更进一步说,Class是一个java中的泛型类型。 对于我们自己定义的类,我们用类来抽象现实中的某些事物,比如我们定义一个名称...

loveyu0428的专栏 324

基于STM32L4XX 、HAL库的DRV8311三相无刷直流电机(BLDC)驱动应用C语言程序设计

是德州仪器(TI)推出的一款针对三相无刷直流(BLDC)电机或永磁同步电机(PMSM)的集成驱动器芯片。:集成了三个半桥MOSFET、门极驱动电路、电荷泵(支持100%占空比)、稳压器以及多种保护电路。:工作电压最高可达,持续输出电流可达,峰值电流可达。:通过引脚直接控制每个半桥的PWM和使能。这种方式需要MCU输出6路信号,控制更灵活。:通过SPI总线配置内部寄存器,仅需PWMA/B/C三路PWM信号即可控制电机。可以读取故障状态、配置参数(如死区时间、电流保护阈值等),是更常用和推荐的方式。

PP_Cottage的博客 556

java filed类源码_看了Java的Class的源码,我自闭了

1.class这个类是什么Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一般的类,接口,枚举类型,注解类型等等。这么说可能有点太理论,我们看下面这个例子:我们将生活中的一类事物抽象为一个类的时候,往往是因...

weixin_29608475的博客 200

90. 将 SAP ABAP 内表内容本地导出成 Excel 文件

这里文件扩展名为 csv,全称是 Comma-Separated Values,意思是这种类型的文件内容,由逗号分隔。除了 ASC 之外,另一个可用的选项是 BIN,适用于 PDF,EXE 等二进制文件的导出。支持海量的输入和输出参数,我们这个简单的本地导出场景里,大部分参数都用不上。这个分隔符的添加逻辑,编写在上图红色高亮矩形框内,使用的语法是。本教程有学习者向我提问,询问如何将 ABAP 某某函数的某某输出参数的值,导出成本地 Excel 文件。把这个内表的内容,下载到本地,以本地文件的方式保存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1743

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

获取class属性_看了Java的Class的源码,我自闭了

作者丨chenweicool来源:https://www.cnblogs.com/chentang/p/13170081.html1.class这个类是什么Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一...

weixin_39945523的博客 196

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java object转int_看了Java的Class的源码,我自闭了

作者丨chenweicool1.class这个类是什么Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一般的类,接口,枚举类型,注解类型等等。这么说可能有点太理论,我们看下面这个例子:我们将生活中的一类事物...

weixin_40008884的博客 66

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java带参数的构造方法_看了Java的Class的源码,我自闭了

作者丨chenweicool1.class这个类是什么Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一般的类,接口,枚举类型,注解类型等等。这么说可能有点太理论,我们看下面这个例子:我们将生活中的一类事物...

weixin_39654352的博客 639

看了Java的Class类之后,我自闭了

java源码之Class ​ 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝。这是我的源码系列第二弹,后续还会一直更新,欢迎交流。String源码可以看我的Java源码之String,如有不足,希望指正。 1.class这个类是什么 Class的本质也是一个类,只不过它是将我们定义类的共同的部分进行抽象,比如我们常定义的类都含有构造方法,类变量,函数,而Class这个类就是来操作这些属性和方法的。当然我们常定义的类包含的类型都可以通过Class间接的来操作。而类的类型包含一般的类,接口,枚举类

weixin_43469379的博客 216

autowired注入为null_spring中自动注入field的继承问题

推荐阅读:我是如何被算法虐到自闭的?字节跳动抖音Java一面二面面经分享Java程序员4面字节最终斩获offer,只有努力复习,方能战胜寒冬斩获阿里P7Offer,这一份Java面试文档,送给年后换工作的程序员先说问题隔离在家,闲的蛋疼,正好有空梳理一下项目里的代码,就是所谓的重构罗,但是呢,我很显然没有相关的经验和知识,就是想把一些java里的继承之类的、设计模式之类的给用上。 但是由于spri...

weixin_39926394的博客 122

正则表达式完整知识体系

正则表达式(Regex)是一种文本处理工具,通过特殊字符组合定义匹配模式,用于字符串的查找、校验、提取和替换。核心特性包括: 基础语法 元字符:.(任意字符)、\d(数字)、\w(单词字符)等 量词:+(1次以上)、*(0次以上)、{n,m}(次数范围) 分组:()捕获内容,(?:)非捕获分组 边界:^(起始)、$(结尾)、\b(单词边界) 高级功能 零宽断言:(?=)(正向先行)、(?<=)(正向后行)实现精准匹配 贪婪/非贪婪:默认贪婪匹配,?切换非贪婪 修饰符:g(全局)、i(忽略大小写)、s(

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 630

jvm面试2 jvm如何加载java代码? JVM知识重点:内存模型和GC

jvm如何加载java代码? native方法forName0 JVM知识重点:内存模型和GC’ 注意:jvm是一个内存中的虚拟机 下面是Class类中,我们常用的forName方法 @CallerSensitive public static Class&lt;?&gt; forName(String className) throws Class...

炫的博客 282

Class类中的forName0()方法为什么没有实现?

Class类中的方法forName0没有实现? 原因在于该方法的前边使用native 关键字修饰。 使用关键字修饰意思就是这个这个方法是原生函数,底层是C/C++语言实现的,并且编译成了DLL文件,这个java方法只是调用而已,这些函数的实现体都在DDL文件中写着,所以JDK源码中没有,所以你就看不见,也没有实现。 ...

SoWhatWorld的博客 1903

java的Class类源码详解

java的Class类源码详解 类的定义 ublic final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, ...

悦分享 5613

java.lang.Class 类

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33912246的博客 597
上一篇: MyBatis:对不起,这锅我不能背(给年轻的程序员上一课呀)
下一篇: Java多线程你真的理解透彻了吗?带你玩转一次多线程!
Java架构技术官
博客等级 码龄6年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值