class

Java在识别类信息与加载它时,通常有两种方式来对类信息进行操作:


  1. RTTI,类在编译时期就已经知道类的信息,我们调用时直接进行了new 对象;
  2. 反射机制,这一种是在程序运行时进行了类加载,而前提是我们在编译时期没有进行加载

每一个类都会对应存在的class对象,也就是存在于.class文件,在我们的一次使用的时候,jvm就回调用它;

而static初始化,会在类加载时进行


我们在进行引用时,类加载器首先会检查一下这个class对象是否被加载过,如果没有被加载,就回根据这个类名进行查找相对应的class文件,加载文件,然后进行对其方法的引用。

我们在进行获取引用时,我们可以进行使用Class.forName("),进行对这个类的加载,也可以用(类名).class对这个类进行加载,但是(类名),class不会进行对这个对象进行初始化

加载一般分为三个步骤进行:


  1. 加载,类加载器进行加载此此对象,找到对应的字节码,创建一个class对象
  2. 链接:验证字节码文件,并且对静态域创造空间
  3. 初始化:检查是否有超类,如果有就对其进行加载,并且对其执行静态初始化域,跟静态初始化块。



class MyBean{       static{         syso(“进行mybean的static加载!”);     }   }     public class Main {       public static void main (String[] args){              syso(".class加载");             Class clazz1=MyBean.class();             syso("class.forname 加载");             Class clazz2=Class.forName("MyBean");                            //类型转化前的检验很重要一般使用instanceof进行判断                  }



Method 的 getReadMethod 与 getWriteMethod 的使用

【获取一个对象的所有属性字段名称和其对应的值】


package Java;   import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;   class TextMain2 implements Serializable {     private String name;     private String age;     public TextMain2() {     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public String getAge() {         return age;     }     public void setAge(String age) {         this.age = age;     }     public TextMain2(String name , String age){         this.name=name;         this.age=age;     } }   public class TextMain{     public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {         TextMain2 tm= new TextMain2("zhanghao" ,"1");//对其进行初始化         Class clazz=tm.getClass();         Field[] fields=clazz.getDeclaredFields();//获取其声明的字段         for (Field field:fields) {             String key = field.getName();//System.out.println(key);   //输出name   //     age             //创建一个属性描述器             PropertyDescriptor descriptor = new PropertyDescriptor(key,clazz);  //给一个属性,获取值             Method method = descriptor.getReadMethod();     //相当于为上面声明的字段设置get方法             Method method2= descriptor.getWriteMethod();    //为上面声明的字段设置set方法(又称内省)             Object ob= method.invoke(tm);             System.out.println( key +":"+ ob);             method2.invoke(tm,new String[]{"123456789"});         }         System.out.println(  tm.getName());         /*输出结果:         name:zhanghao         age:1         123456789*/              } }