设为首页 加入收藏

TOP

day43-反射02(二)
2023-07-23 13:41:46 】 浏览:50
Tags:day43- 反射
reflection :Class对象对应的类是在哪个包下面 //4.得到全类的名称 System.out.println(cls.getName());//li.reflection.Car //5.通过cls创建一个对象实例 Car car = (Car)cls.newInstance(); System.out.println(car);//调用car.toString() //6.通过反射获得属性 如:brand Field brand = cls.getField("brand"); System.out.println(brand.get(car));//宝马 //7.通过反射给属性设置值 brand.set(car,"奔驰"); System.out.println(brand.get(car));//奔驰 //8.遍历得到所有的属性(字段) Field[] fields = cls.getFields(); for (Field f:fields) { System.out.println(f.getName());//依次输出各个属性字段的名称 } } }

2.3获取Class类对象的各种方式

  1. 前提:已经知道一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

    实例:Class cls1 = Class.forName("java.lang.Cat");

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

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

    实例:Class cls2 = Cat.class;

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

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

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

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

  4. 其他方式

    ClassLoader cl = 对象.getClass().getClassLoad();

    Class cls4 = cl.loadClass("类的全类名");

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

    Class cls = 基本数据类型.class

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

    Class cls = 包装类.TYPE

例子:

package li.reflection.class_;

import li.reflection.Car;

//演示得到Class对象的各种方式
public class getClass_ {
    public static void main(String[] args) throws ClassNotFoundException {

        //1.Class.forName
        String classAllPath = "li.reflection.Car";//这里一般是通过配置文件获取全路径
        Class cls1 = Class.forName(classAllPath);
        System.out.println(cls1);//class li.reflection.Car

        //2.类名.class ,多用于参数传递
        Class cls2 = Car.class;
        System.out.println(Car.class);//class li.reflection.Car

        //3.对象.getClass() ,应用场景,有对象实例
        Car car = new Car();
        Class cls3 = car.getClass();
        System.out.println(cls3);//class li.reflection.Car

        //4.通过类加载器(4种)来获取到类的 Class对象
        //(1)先得到car对象的类加载器(每个对象都有一个类加载器)
        ClassLoader classLoader = car.getClass().getClassLoader();
        //(2)通过类加载器得到Class对象
        Class cls4 = classLoader.loadClass(classAllPath);
        System.out.println(cls4);//class li.reflection.Car

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

        //5.基本数据类型按如下方式得到Class类对象
        Class<Integer> integerClass = int.class;
        Class<Character> characterClass = char.class;
        Class<Boolean> booleanClass = boolean.class;
        System.out.println(integerClass);//int
        System.out.println(characterClass);//char
        System.out.println(booleanClass);//boolean

        //6.基本数据类型对应的8种包装类,可以通过 .TYPE得到Class类对象
        Class<Integer> type1 = Integer.TYPE;
        Class<Character> type2 = Character.TYPE;
        System.out.println(type1);

        System.out.println(integerClass.hashCode());//1846274136
        System.out.println(type1.hashCode());//1846274136
        
    }
}

2.4哪些类型有Class对象

  1. 外部类,成员内部类,静态内部类,局部内部类,匿名内部类
  2. interface:接口
  3. 数组
  4. enum:枚举
  5. annotation:注解
  6. 基本数据类型
  7. void

例子:

package li.reflection.class_;

import java.io.Serializable;

//演示哪些类有Class对象
public class allTypeClass {
    public static void main(String[] args) {

        Class<String> cls1 = String.class;//外部类
        Class<Serializable> cls2 = Se
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Jmix 中 REST API 的两种实现 下一篇mybatisplus不支持sum,但支持这个

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目