转:
class反射(一),以及Method 的 getReadMethod 与 getWriteMethod 使用
class
Java在识别类信息与加载它时,通常有两种方式来对类信息进行操作:
- RTTI,类在编译时期就已经知道类的信息,我们调用时直接进行了new 对象;
- 反射机制,这一种是在程序运行时进行了类加载,而前提是我们在编译时期没有进行加载
每一个类都会对应存在的class对象,也就是存在于.class文件,在我们的一次使用的时候,jvm就回调用它;
而static初始化,会在类加载时进行
我们在进行引用时,类加载器首先会检查一下这个class对象是否被加载过,如果没有被加载,就回根据这个类名进行查找相对应的class文件,加载文件,然后进行对其方法的引用。
我们在进行获取引用时,我们可以进行使用Class.forName("),进行对这个类的加载,也可以用(类名).class对这个类进行加载,但是(类名),class不会进行对这个对象进行初始化
加载一般分为三个步骤进行:
- 加载,类加载器进行加载此此对象,找到对应的字节码,创建一个class对象
- 链接:验证字节码文件,并且对静态域创造空间
- 初始化:检查是否有超类,如果有就对其进行加载,并且对其执行静态初始化域,跟静态初始化块。
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*/ } }
原文章:https://www.cnblogs.com/luoxn28/p/5686794.html
建议同志们看一下原文章,原文章内容比较充实