学习内容: 1、 Java类 2、 反射 3、 反射相关API
学习时间: 1、 2021年10月22日 2、 2021年10月24日
学习产出: 1、 技术笔记 1 遍 回忆:java类
1.设计类
2.创建对象(两种方式)
new Car();
IO反序列化
3.调用类的方法和属性
反射java反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能成为java语言的反射机制。
作用:动态获取类的信息,进一步实现需要的功能
反射相关APIClass 类型
Constructor 构造方法
Method 方法
Field 属性
除了Class外,其他类都位于java.lang.reflect包中
反射API将类的类型、方法、属性都封装成了类
Class类Class类的对象表示正在运行的Java应用程序中的类和接口.
获得Class类的三种方法
Class c1 = Car.class;//类名.class方式
System.out.println(c1);//class com.ffyc.dormMS.reflect.Car
Class c2 = new Car().getClass();//Object类中的getClass方法
System.out.println(c2);
System.out.println(c1==c2);//true
String carpath = "com.ffyc.dormMS.reflect.Car";
Class c3 = Class.forName(carpath);//Class类的静态方法
System.out.println(c3);
System.out.println(c2==c3);//true
Car car = (Car)c1.newInstance();//创建由此 类对象表示的类的新实例。
Constructor类
Constructor类可以通过getXXX方法获得构造方法的基本信息
Constructor实例通过Class实例获得(newInstance())
String carpath = "com.ffyc.dormMS.reflect.Car";
Class c3 = Class.forName(carpath);//根据类的地址将类信息加载到内存中,并创建类的Class对象
//Constructor类可以通过getXXX方法获得构造方法的基本信息
Constructor[] cons = c3.getDeclaredConstructors();//返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组类
for (Constructor con : cons){
System.out.println(con.getName());
System.out.println(con.getParameterCount());
System.out.println(con.getParameterTypes());
}
Field类
Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值
获得Field实例,都是通过Class中的方法实现
String carpath = "com.ffyc.dormMS.reflect.Car";
Class c3 = Class.forName(carpath);//Class类的静态方法
Car car = (Car)c3.newInstance();
//返回一个 Field对象,它反映此表示的类或接口的所有属性的类对象
Field[] fs = c3.getDeclaredFields();
for (Field f : fs){
f.setAccessible(true);
if(f.getName().equals("name")){
f.set(car,"宝马");
}
if(f.getName().equals("color")){
f.set(car,"黑色");
}
}
Method类
Method类将类中的方法进行封装,可以动态获得方法的信息
getName:获得方法名字
getParameterTypes:获得方法参数类型,把参数封装到一个对象中去
除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法
invoke(Object obj, Object… args) :使用obj调用该方法,参数
为args
Method实例都是通过Class类的方法获得
Method getMethod(String name, Class… parameterTypes) :通过指定方法名,参数类型,返回一个 Method实例
String carpath = "com.ffyc.dormMS.reflect.Car";
Class c = Class.forName(carpath);//Class类的静态方法
Car car = (Car)c.newInstance();
Field[] fs = c.getFields();
for (Field f : fs){
Method m4 = c.getMethod("get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1));
System.out.println(m4.getName());
System.out.println(m4.getTypeParameters());
m4.invoke(car);
}



