Java笔记整理 —— 反射、Class类

    通过外部文件配置,在不修改源码情况下,来控制程序,也符合设计模式的ocp原则(不修改源码,且能扩容功能),这样的需求在框架里特别多。

反射机制

反射机制可以完成的功能

反射相关类

程序加载的三个阶段

Class类对象在堆中,其对应生成的对象也在堆中。

反射优化

反射的优点与缺点

优化方法 

xxx.setAccessible(true); //在反射调用方法时,取消访问检查

Class类

基本介绍

public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class a1 = Class.forName("reflection.Car");
        Class a2 = Class.forName("reflection.Car");
        System.out.println(a1.hashCode()); //1134712904
        System.out.println(a2.hashCode()); //1134712904
        //hashCode相同,说明Class只被系统创建一次
    }
}

常用方法 

public class Class01 {
    public static void main(String[] args) throws ... {
        //1. 类的完整路径
        String classAllPath = "reflection.Car";

        //2. 获取到Car类 对应的Class对象,<?>表示不确定的Java类型
        Class<?> cls = Class.forName(classAllPath);
        System.out.println(cls); //显示哪个类的Class对象  class reflection.Car
        System.out.println(cls.getClass());//输出cls的运行类型  class java.lang.Class
       
        //3. 得到包名
        System.out.println(cls.getPackage().getName()); //reflection
        //4. 得到全类名
        System.out.println(cls.getName()); //reflection.Car
        //5. 通过cls创建对象实例
        Car car = (Car)cls.newInstance();
        //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 field : fields) {
            System.out.println(field.getName());
        }

获取Class对象的方法

        //1. Class.forName
        String classAllPath = "reflection.Car";
        Class<?> cls1 = Class.forName(classAllPath);
        System.out.println(cls1);// class reflection.Car

        //2. 类名.class
        Class cls2 = Car.class;
        System.out.println(cls2);  //class reflection.Car

        //3. 对象.getClass()
        Car car = new Car();
        Class cls3 = car.getClass();
        System.out.println(cls3); //class reflection.Car

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

        //5. 基本数据类型
        Class<Integer> integerClass = int.class;
        Class<Boolean> booleanClass = boolean.class;
        System.out.println(integerClass); //int

        //6. 基本数据类型对应的包装类
        Class<Integer> type = Integer.TYPE;
        Class<Boolean> type1 = Boolean.TYPE;
        System.out.println(type); //int
        System.out.println(integerClass.hashCode()); //1766822961
        System.out.println(type.hashCode()); //1766822961

哪些类型有Class对象

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值