首页 > 其他分享 >Class类

Class类

时间:2023-05-23 12:05:28浏览次数:18  
标签:Class System class println public out

1. 基本介绍  715

Class类_类对象

1. Class也是类,因此也继承Object类 [类图]

2. Class类对象不是new出来的,而是系统创建的

3.对于某个类的Class类对象,在内存中只有一份, 因为类只加载一次

4.每个类的实例都会记得自己是由哪个Class实例所生成

5.通过Class对象可以完整地得到一个类的完整结构,通过一系列API

6. Class对象是存放在堆的

7.类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等) 

代码在com.stulzl.class_.包中

Class_01

package com.stulzl.class_;

import com.stulzl.cat.Cat;

//对Class类特点的梳理   715
public class Class_01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //1. Class也是类,因此也继承Object类
        //2. Class类对象不是new出来的,而是系统创建的
        //(1) 传统 new 对象,调用ClassLoader 类的loadClass方法加载Cat类的Class对象
        /* ClassLoader 类
            public Class loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
        */
        //Cat cat = new Cat();

        //反射方式
        /*
            ClassLoader 类, 仍然是通过 ClassLoader 类加载 Cat 类的 Class 对象
            public Class loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
         */
        Class cls1 = Class.forName("com.stulzl.cat.Cat");

        //3.对于某个类的Class类对象,在内存中只有一份, 因为类只加载一次[演示]
        Class cls2 = Class.forName("com.stulzl.cat.Cat");
        //如果cls1和cls2d的hashCode值一样,说明二者是同一个对象
        System.out.println(cls1.hashCode());//356573597
        System.out.println(cls2.hashCode());//356573597

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

    }
}

Cat类

package com.stulzl.cat;

//反射的问题引入  710
//Cat类
public class Cat {
    private String name = "招财猫";
    public int age = 10;

    //无参构造器
    public Cat(){

    }

    //有参构造器
    public Cat(String name){
        this.name = name;
    }
    public void hi(){//常用方法
        //System.out.println("hi "+name);
    }
    public void cry(){
        System.out.println("喵喵喵叫……");
    }
}

2. Class 类的常用方法  716

Class类_System_02

2.1 应用实例

代码在com.stulzl.class_02.

Class_02
package com.stulzl.class_02;

import com.stulzl.Car;

import java.lang.reflect.Field;

//Class 类的常用方法  716
public class Class_02 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        String classAllPath = "com.stulzl.Car";
        //获取到Car对应的Class对象
        //表示不确定的java类型,写不写都行
        Class cls = Class.forName(classAllPath);
        //输出cls
        System.out.println(cls);//显示cls对象是哪个类的Class类对象 即com.stulzl.Car
        System.out.println(cls.getClass());//输出cls运行类型,java.lang.Class

        //得到包名
        System.out.println(cls.getPackage().getName());//com.stulzl

        //得到全类名
        System.out.println(cls.getName());//com.stulzl.Car

        //通过cls创建对象实例
        //Object o = cls.newInstance();
        //可以强制类型转换即
        Car car = (Car)cls.newInstance();
        System.out.println(car);//Car{brand='宝马', price=500000, color='白色'}

        //通过反射获取对象的属性例如brand
        Field brand = cls.getField("brand");
        System.out.println(brand.get(car));//宝马//提示如果是私有属性会报错,后面在解决
        //通过反射给属性赋值
        brand.set(car,"奔驰");//通过反射给car对象的brand属性赋值为奔驰
        System.out.println(brand.get(car));//奔驰

        //希望可以得到所有的属性(字段)
        System.out.println("=====所有的字段属性=====");
        Field[] fields = cls.getFields();
        //使用增强for
        for(Field f:fields){
            System.out.println(f.getName());//获取名称
            System.out.println(f.get(car));//获取值
        }
        //使用普通for
        System.out.println("=====普通for========");
        for (int i = 0; i < 3; i++) {
            System.out.println(fields[i].getName());
            System.out.println(fields[i].get(car));
        }

    }
}
Car类
package com.stulzl;

//Class 类的常用方法  716
//Car类
public class Car {
    public String brand = "宝马";
    public int price = 500000;
    public String color = "白色";

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}

3. 获取 Class 类对象  717

1. 前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException, 实例: Class cls1 = Class.forName( "java.lang.Cat" );

应用场景:多用于配置文件,读取类全路径,加载类.

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

最高实例: Class cls2 = Cat.class;

应用场景:多用于参数传递,比如通过反射得到对应构造器对象.

3. 前提:已知某个类的实例,调用该实例的getClass() 方法获取Class对象,

实例: Class clazz =对象.getClass();//运行类型

应用场景:通过创建好的对象,获取Class对象.

4. 其他方式

ClassLoader cl =对象.getClass().getClassLoader(0;

Class clazz4 = cl.loadClass(“类的全类名”);

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

Class类_Class_03

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

Class类_应用场景_04

代码在com.stulzl.get_class.

GetClass_

package com.stulzl.get_class;

import com.stulzl.Car;

//演示得到class对象的各种方式  717
public class GetClass_ {
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一  Class.forName()
        //1. 前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,
        // 可能抛出ClassNotFoundException,
        //应用场景:多用于配置文件,读取类全路径,加载类.
        String classAllPath  = "com.stulzl.Car";//这个全类名一般是通过配置文件得到的
        Class cls1 = Class.forName(classAllPath);
        System.out.println(cls1);

        //方式二  类名.class
        //2. 前提:若已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能
        //应用场景:多用于参数传递,比如通过反射得到对应构造器对象.
        Class cls2 = Car.class;
        System.out.println(cls2);

        //方式三  对象.getClass()
        //3. 前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象,
        //应用场景:通过创建好的对象,获取Class对象.
        Car car = new Car();
        Class cls3 = car.getClass();//运行类型
        System.out.println(cls3);

        //方式四  通过类加载器来获取到类的Class对象
        //(1).先得到类加载器car
        ClassLoader classLoader = car.getClass().getClassLoader();
        //(2).通过类加载器的Class对象
        Class cls4 = classLoader.loadClass(classAllPath);
        System.out.println(cls4);

        //cls1 , cls2 , cls3 , cls4 其实是同一个对象
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        System.out.println(cls3.hashCode());
        System.out.println(cls4.hashCode());

        //5. 基本数据(int, char,boolean,float,double,byte,long,short)
        // 按如下方式得到 Class 类对象
        Class integerClass = int.class;
        Class characterClass = char.class;
        Class booleanClass = boolean.class;
        System.out.println(integerClass);//int

        //6. 基本数据类型对应的包装类,可以通过 .TYPE 得到 Class 类对象
        //其它包装类 BOOLEAN, DOUBLE, LONG,BYTE 等等就不演示了
        Class type1 = Integer.TYPE;
        Class type2 = Character.TYPE;
        System.out.println(type1);//int

        System.out.println(integerClass.hashCode());//1735600054
        System.out.println(type1.hashCode());//1735600054

    }
}

Car类

package com.stulzl;

//Class 类的常用方法  716
//Car类
public class Car {
    public String brand = "宝马";
    public int price = 500000;
    public String color = "白色";

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}

4. 哪些类型有 Class 对象  718

4.1 如下类型有 Class 对象

外部类,成员内部类,静态内部类,局部内部类,匿名内部类

2. interface :接口

3.数组

4. enum :枚举

5. annotation :注解

6.基本数据类型

7.void

4.2 应用实例

代码在com.stulzl.all_type_class.

AllTypeClass

package com.stulzl.all_type_class;

import java.io.Serializable;

//演示哪些类型有 Class 对象  718
public class AllTypeClass {
    public static void main(String[] args) {
        //外部类
        Class cls1 = String.class;
        //接口
        Class cls2 = Serializable.class;
        //数组
        Class<Integer[]> cls3 = Integer[].class;
        //二维数组
        Class<float[][]> cls4 = float[][].class;
        //注解
        Class cls5 = Deprecated.class;
        //枚举
        Class cls6 = Thread.State.class;//State就是一个枚举
        //基本数据类型,例如long
        Class cls7 = long.class;
        //void数据类型
        Class cls8 = void.class;
        //Class
        Class cls9 = Class.class;//Class也是一种类

        System.out.println(cls1);
        System.out.println(cls2);
        System.out.println(cls3);
        System.out.println(cls4);
        System.out.println(cls5);
        System.out.println(cls6);
        System.out.println(cls7);
        System.out.println(cls8);
        System.out.println(cls9);

    }
}

标签:Class,System,class,println,public,out
From: https://blog.51cto.com/u_15784725/6330487

相关文章

  • UE4 UCLASS(...)
    类说明符UCLASS和元数据(meta)可以定义引擎和编辑器特定的行为。类声明的语法如下所示:UCLASS([specifier,specifier,...],[meta(key=value,key=value,...)])classClassName:publicParentName{GENERATED_BODY()}声明包含一个类的标准C++类声明。在标准声......
  • 【cpluscplus教程翻译】Classes (II)
    操作符重载本质上,类就是在C++代码里定义了新的类型,在代码中,类型不仅用来构造和赋值,还可以用操作符进行运算,考虑基础类型的加减乘除inta,b,c;a=b+c;上面这个例子用了加法操作符和赋值操作符,对于基础类型,这些操作的含义非常显而易见且无歧义,但是对自定义类型来说,不见得......
  • ISay obj=(ISay)Class.forName(args[0]).newInstance(); obj.say();
    classmainClass{publicstaticvoidmain(String[]args){System.out.println(args[0]);try{ISayobj=(ISay)Class.forName(args[0]).newInstance();obj.say();}catch(InstantiationExceptione){//TODOAuto-generatedcatch......
  • 全新的照片后期处理软件Lightroom Classic 2022(lrc2022)Mac版
    LightroomClassic2022是一款全新的照片后期处理。通过使用其卓越的图形处理功能,该软件不仅可以帮助您轻松地制作出创意的照片,而且还可以为您带来意想不到的效果。对照片,视频和图像编辑工具进行优化。这些新功能使您可以在处理图像时使用编辑器之外的方法进行编辑,从而节省时间并......
  • C++中使用强类型的Enum Class
    在C++中,有Enumclass这种说法,在EffectivemodernC++这本书中,也提到Preferscopedenumstounscopedenum,就是说要用有范围的enumclass代替没有范围的enum.为什么会有这个问题呢?我们来看一个C++里面使用传统enum的例子:enumShape{circle,retangle};autocircle=10;......
  • Mutex class和lock关键字之间的区别
    WhatisthedifferencebetweenusingMutexclassandusingthelockkeyword? HereisatablethatsummarizesthekeydifferencesbetweentheMutexclassandthelockkeyword:FeatureMutexclassLockkeywordWeightHeavyweightLightweightSpeedSlow......
  • el-table的header-row-class-name或者row-class-name不生效的解决办法?
    思路如果使用的node脚手架,你的style标签长这样:<stylescoped></style>,那么只需要在给header-row-class-name或者row-class-name指定的css类上做个样式穿透。解决办法如:<el-table row-class-name="table-row-class"></el-table><stylescoped> /deep/.table-row-clas......
  • Duplicate class androidx.lifecycle.ViewModelLazy found in modules lifecycle-view
    AS版本:AndroidStudioBumblebee|2021.1.1Patch1Build#AI-211.7628.21.2111.8139111,builtonFebruary2,2022Runtimeversion:11.0.11+9-b60-7590822amd64VM:OpenJDK64-BitServerVMbyOracleCorporationWindows1010.0GC:G1YoungGeneration,G1OldGene......
  • APP自动化-异常截图-利用内存空间(class)
    根据 APP自动化-异常截图-利用内存空间(list),这里还可以使用类的方法。在Package目录下建立一个什么情况下可以操作内存空间.py的文件,里面建立一个类classComtext:#类名可以随便定义pass 然后在conftest1中设置引入类,然后使用python内置函数 setattr函数映射i......
  • 使用nfs作为kubernetes动态storageClass存储
    使用nfs作为kubernetes动态storageClass存储1、StorageClass介绍参考网址:https://github.com/kubernetes-retired/external-storage​https://blog.51cto.com/xuexinhuan/5394844StorageClass对象会定义下面两部分内容:1:PV的属性.比如,存储类型,Vo......