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_反射的主要内容,如果未能解决你的问题,请参考以下文章