发表于: 2020-09-19 23:21:54

1 1407


今天完成的事:

反射的了解。

反射
概念:反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意内部属性及方法。
Class c=Class.forName("java.lang.String")

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个Class对象),这个对象就包含了完成的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,我们形象的称之为:反射


正常方式:引入需要的“包类”名称-->通过new实例化-->取得实例化对象

反射方式:实例化对象-->getClass()方法-->得到完整的“包类”名称


优点:
可以实现动态创建对象和编译,体现出很大的灵活性
缺点:
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的请求。这类操作总是慢于直接执行相同的操作。

最重要的内容----检查类的结构

需要用到的三个基本方法:

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");
//        判断方法或者构造器是否是publicprivatefinal
       String modifiers= Modifier.toString(c.getModifiers());
       if(modifiers.length()>0){
          System.out.println(modifiers);
       }

上面的代码是测试构造方法的修饰符。

返回构造方法中参数类型
Class[] paramTypes=constructor.getParameterTypes();

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);
   }
}

关键点:
1.一个类在内存中只有一个Class对象,一个类被加载后,类的整个结构都会被封装在Class对象中.
2.Class类:

对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,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 熔断器,网关的配置和了解原理。

遇到的问题:

收获:

了解了一些反射的知识。


返回列表 返回列表
评论

    分享到