反射机制:
在运行状态中 对于任意一个类,都能够知道这个类的所有的属性和方法
获取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);
}
}