023_反射

Posted a276665092

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了023_反射相关的知识,希望对你有一定的参考价值。

Properties

存储的Key Value键值对

他的两个方法:
getPorperties(key) -->获取value值
setProperties --> 设置Key、value(键值对)

反射

分清类对象类的对象

 

类的对象:基于一个模板new出来的对象
类对象:类加载的产物,封装了一个类的所有信息(类名,包名,属性,方法,接口,构造..)
Ps:一个类对象指向的就是 .class 文件

类对象创建的方式

// 方式一:
// 通过类的对象获取  对象.getClass()
        Student stu = new Student();
    Class c1 = stu.getClass();
// 此时的c1就是Student的类对象,里面封装了该类所有的信息。    
// 方式二:
    // 通过类名获取
    Class c2  = Student.class;
// 方式三:
    // 通过一个静态方法
    Class.forName(全类名);
    Class c3 = Class.forName(包名.类名);

类对象常用方法

// 获取类对象--》Student  .class 文件
Class c1 = Student.class;
// 1.获取的是类对象的名字
c1.getName();
// 2.获取包名
c2.getPackage();
// 3. 获取父类
c1.getSuperclass();
// 4. 获取所有接口
c1.getInterfaces();
// 5.获取所有属性(本类以及父类所有的公共属性)
c1.getFields();
// 6. 获取本类中所有声明的属性包括私有
c1.getDeclaredFields();
// 7.获取所有的方法(本类以及父类所有的公共方法)
c1.getMethods();
// 8.获取本类中所有声明的方法包括私有
c1.getDeclaredMethods();
// 9. 获取所有的构造
c1.getConstructors();
// 10.通过类对象创建类的对象(就是一个Student对象)
c1.newInstance();

通过反射给属性复制

//1. 通过类对象 获取具体的属性
//2. set(具体给哪个实例对象赋值,值)

如何给私有属性赋值
    getDeclaredField(属性名)
    打开权限   setAccessible(true)
    再赋值  set()
    //获取类对象
        Student stu1 = new Student();
        Student stu2 = new Student();
        Student stu3 = new Student();
        
        Class c = stu1.getClass();
        
        //获取属性
        Field field = c.getField("age");  //Filed  
        //set(具体哪个实例对象,值)
        field.set(stu1, 18);
        
        Field field2 = c.getField("age"); 
        field2.set(stu2, 20);
        
        Field field3 = c.getField("name");
        
        field3.set(stu1, "周杰伦");
        field3.set(stu2,"蔡依林");
        
        Field field4 = c.getField("sex");
        field4.set(stu1,"男");
        field4.set(stu2,"女");
    
        
        Field df = c.getDeclaredField("weight");
        //此时需要打开权限
        df.setAccessible(true);
        df.set(stu1, 70);
        df.set(stu2, 50);
        
        System.out.println(stu1);
        System.out.println(stu2);

单例模式

// 只能创建一个实例
饿汉模式:
//只能有一个实例 的类
// 天生没有线程安全问题 , 但是 由于加载后 立马创建对象,浪费内存空间  。 
class SingleTon{
    public static final SingleTon instance = new SingleTon();
    
    private SingleTon(){}
    
    public static SingleTon getInstance(){
        
        return instance;
    }
}

懒汉模式 :
//是在需要实例 时 再创建 比 饿汉节省内存; 线程不安全
class LazySingleTon{
    //定义常量 用于接收 实例
    private static LazySingleTon INSTANCE =null;
    
    //1. 先把构造器私有化
    private LazySingleTon(){}
    
    //2.方法里new 
    public synchronized static LazySingleTon getInstance(){
        //如果为空 则new 不为空直接返回原来的实例
        if(INSTANCE == null){
            //T1    T2
            INSTANCE = new LazySingleTon();
        }
        return INSTANCE;
    }
}

以上是关于023_反射的主要内容,如果未能解决你的问题,请参考以下文章

023_go语言中的通道

ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER003_播放mp3

023_decorater

023_supervisorctl管理服务注意事项

023_接口类,抽象类,多态,鸭子类型,封装

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?