java 反射学习笔记
1.获取class文件对象的三种方式。如果是自己写着玩,任选一种方式,实际开发用第三种。
//方式1:Object类的getClass()方法 Person person = new Person(); Class c1 = person.getClass();
//方式2:数据类型的静态属性class Class c2 = Person.class; //方式3:Class类中的静态方法forName(); Class c3 = Class.forName("com.example.Person");
2.获取构造方法并使用
//获取字节码文件对象; Class c = Class.forName("com.example.Person"); //获取所有公共构造方法 Constructor[] cons1 = c.getConstructors(); //获取所有构造方法 Constructor[] cons2 = c.getDeclaredConstructors(); //获取单个无参构造方法 Constructor con3 = c.getConstructor(); //获取单个带参的构造方法 Constructor con4 = c.getConstructor(int.class, String.class); //获取私有构造方法 Constructor con5 = c.getDeclaredConstructor(String.class); //通过无参构造方法创建类的新实例 Object object1 = con3.newInstance(); //通过带参的构造方法创建类的新实例 Object object2 = con4.newInstance(10, "李雷"); //通过私有构造方法创建类的新实例 con5.setAccessible(true);//值为true则表示反射的对象在使用时应该取消java语言访问检查 Object object3=con5.newInstance("韩梅梅");
3.获取成员变量并使用
//获取字节码文件对象; Class c = Class.forName("com.example.Person"); //获取所有公共成员变量 Field[] f1 = c.getFields(); //获取所有成员变量 Field[] f2 = c.getDeclaredFields(); for (Field field : f2) { System.out.println(field); } //获取构造方法,创建对象 Constructor con = c.getConstructor(); Object obj = con.newInstance(); //获取单个成员变量并赋值 Field f3 = c.getField("city");//获取公有成员变量 Field f4 = c.getDeclaredField("age");//获取成员变量(不管共有私有都能获取) f4.setAccessible(true);//取消访问检查 f3.set(obj, "北京");//对象赋值 f4.set(obj, 20);
4.获取成员方法并使用
//获取字节码文件对象; Class c = Class.forName("com.example.Person"); //获取构造方法,创建对象 Constructor con = c.getConstructor(); Object obj = con.newInstance(); //获取所有成员方法 Method[] m1 = c.getMethods();//获取自己和父类的所有公共方法 Method[] m2 = c.getDeclaredMethods();//获取自己的所有方法 //获取无参单个方法并使用,public void show() Method m3 = c.getMethod("show"); m3.invoke(obj); //获取有参有返回值单个方法并使用,public String say(String str) Method m4 = c.getMethod("say", String.class); Object objStr = m4.invoke(obj, "hello"); //获取私有单个方法并使用,private void eay() Method m5=c.getDeclaredMethod("eay"); m5.setAccessible(true);//取消访问检查 m5.invoke(obj);