反射机制:
在运行状态中 对于任意一个类,都能够知道这个类的所有的属性和方法
获取class 的三种方式:
1、 Class clazz1 = Class.forName("com.heima.bean.Person"); // Class 的静态方法 通过全类名 获取运行类
2、 Class clazz2 = Person.class; // 通过.class文件
3、 Person p = new Person(); Class clazz3 = p.getClass(); // Object的getClass()方法
反射如何拿到构造方法: clazz.newInstance() //只能拿空参 Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); //拿有参构造的对象 : 先获取类Class对象 ,然后用getConstructor(参数)
public class demon3_reflect { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p = (Person) c.newInstance("张三",23); System.out.println(p); } }
public class demon2_reflect { public static void main(String[] args) throws Exception { Juicer j = new Juicer(); BufferedReader br = new BufferedReader(new FileReader("config.properity")); // 读取配置文件中的全类名(带包名的类名) 再用forName() 反射获取类 Class clazz = Class.forName(br.readLine()); fruit f = (fruit)clazz.newInstance(); // 获取到空参构造 父类引用指向子类对象 j.run(f); } } interface fruit { public abstract void squeeze(); } class Apple implements fruit{ public void squeeze() { System.out.println("炸出一杯苹果汁"); } } class Orange implements fruit{ public void squeeze() { System.out.println("炸出一杯juzi汁"); } } class Juicer { public void run(fruit f) { f.squeeze(); } }
通过反射 获取成员变量并使用
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import com.heima.bean.Person; public class demon4_field { /* * 反射 获取成员变量
Field f = clazz.getField("变量名")
f.set(对象名,变量名) // 改变变量值
如果 该变量被私有了,可以先 f.setAccessible(true) ,在调用set() 暴力反射 */ public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); // 获取类对象 Constructor c = clazz.getConstructor(String.class,int.class); // clazz.getContructor(参数) 获取有参构造对象 Person p = (Person) c.newInstance("张三",23); // 通过有参构造,创建类对象 /*Field f = clazz.getField("name"); f.set(p, "李四");*/ Field f = clazz.getDeclaredField("name"); f.setAccessible(true); // 暴力反射 f.set(p, "李四"); System.out.println(p); } }
获取方法:
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import com.heima.bean.Person; public class demon5_method { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p = (Person) c.newInstance("张三",23); Method m = clazz.getMethod("eat"); //获取eat方法 m.invoke(p); Method m2 = clazz.getMethod("eat", int.class); // 获取带参数的 eat()方法 m2.invoke(p, 2); } }