发表于: 2020-09-19 23:21:54
1 1407
今天完成的事:
反射的了解。
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个Class对象),这个对象就包含了完成的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,我们形象的称之为:反射
反射方式:实例化对象-->getClass()方法-->得到完整的“包类”名称
最重要的内容----检查类的结构
需要用到的三个基本方法:
getDeclaredConstructors():返回构造方法的信息
getDeclaredMethods():返回类中的普通方法的信息
getDeclaredFields():返回类中声明的全部域(成员变量)的信息
上述方法返回的信息包括私有和受保护成员。
用来测试的类
public class Person {
private int name;
private String age;
public Person(){};
public Person(int name, String age) {
this.name = name;
this.age = age;
}
private void testMethods(String name){
System.out.println(name);
}
}
判断方法或者构造器是否是private,public,final等修饰符。
String modifiers= Modifier.toString(c.getModifiers());
//先获得Class对象.
Class c=Class.forName("com.annotation.Person");
// 判断方法或者构造器是否是public、private、final
String modifiers= Modifier.toString(c.getModifiers());
if(modifiers.length()>0){
System.out.println(modifiers);
}
上面的代码是测试构造方法的修饰符。
Constructor[] constructors=c.getDeclaredConstructors();
for(Constructor constructor:constructors){
Class[] paramTypes=constructor.getParameterTypes();
for(int j=0;j<paramTypes.length;j++){
System.out.println(paramTypes[j].getName());
}
}
返回普通方法中的修饰符(),方法名、返回的数据类型,形参的数据类型
Method[] methods=c.getDeclaredMethods();
for(Method m:methods){
Class retType=m.getReturnType();
String name=m.getName();
String modifiers= Modifier.toString(m.getModifiers());
if(modifiers.length()>0){
System.out.println(modifiers+" ");
System.out.println(retType.getName()+" "+name);
}
Class[] paramTypes=m.getParameterTypes();
for(int j=0;j< paramTypes.length;j++){
System.out.println(paramTypes[j].getName());
}
}
返回类中的成员变量的修饰符,类型,名字。
Field[] fields=c.getDeclaredFields();
for(Field f:fields){
Class type=f.getType();
String name=f.getName();
String modifiers= Modifier.toString(f.getModifiers());
if(modifiers.length()>0){
System.out.println(modifiers+" ");
System.out.println(type.getName()+" "+name);
}
}
对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个对象包含了特定某个结构(class/interface/enum/annotation/primitive type/viod/[])的有关信息。
1.Class本身也是一个类。
2.Class对象只能由系统建立对象。
3.一个加载的类在JVM中只会有一个Class实例。
4.一个Class对象对应的是一个加载到JVM中的一个.class文件。
5.每个类的实例都会记得自己是由哪个Classs实例所生成。
6.通过Class可以完整的得到一个类中的所有被加载的结构。
7.Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。
明天的计划:
继续了解反射相关知识。
springCloud 熔断器,网关的配置和了解原理。
遇到的问题:
收获:
了解了一些反射的知识。
评论