反射:
主要是指程序可以访问,监测,修改他本身状态的能力,并根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语意。
每一个类通过javac.exe编译之后,会产生一个.class文件,在通过类加载器加载.class文件,此.class文件加载到内存之后就是一个运行时的类,存放在缓存区,这个运行时的类本身就是一个实例,一个运行时类只加载一次。
public class Person { public int age; private String name; public Person() { } public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println("我是一个人!"); } private void eat(String str){ System.out.println("我正在吃"+str); } }
import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by 东 on 2016/11/5. */ public class TestReflect { @Test public void test01() { //在不应用反射的时候,先获取Person类的对象。但是无法访问private权限的属性和方法。 Person person = new Person(); person.setAge(20); person.setName("Mr_List"); System.out.println(person); person.show(); } @Test public void test02() throws Exception { //1.使用反射先获取Person类的class。在java中每个类都会有对应的Class对象, // 在编译之后的.class文件中都会有对应的Class对象,用来记录这个类的类型信息。 Class person_clazz = Person.class; Person person = (Person) person_clazz.newInstance(); /** * 获取Person类的public属性 * */ Field age_field = person_clazz.getField("age"); age_field.set(person, 20); System.out.println(person); /** * 获取Person类的私有属性 * */ //1.获取类的私有属性 Field name_field = person_clazz.getDeclaredField("name"); //2.设置属性为可以修改状态 name_field.setAccessible(true); //3.设置属性值 name_field.set(person, "List"); System.out.println(person); /* * 调用public的方法 * */ Method show_method=person_clazz.getMethod("show"); show_method.invoke(person); /** * 调用private的方法 */ Method eat_method=person_clazz.getDeclaredMethod("eat",String.class); //设置方法使可以调用和修改的状态 eat_method.setAccessible(true); eat_method.invoke(person,"面包"); } }
获取运行时类的Class实例的方法
1 public void test03() throws ClassNotFoundException { 2 //1.通过类的.class属性 3 Class clazz1=Person.class; 4 System.out.println(clazz1); 5 6 //2.通过类的对象 7 Person person=new Person(); 8 Class clazz2=person.getClass(); 9 System.out.println(clazz2); 10 11 //通过Class的静态方法 12 String className="Person"; 13 Class clazz3=Class.forName(className); 14 System.out.println(clazz3); 15 16 //4.通过类加载器 17 ClassLoader classLoader=this.getClass().getClassLoader(); 18 Class clazz4=classLoader.loadClass(className); 19 System.out.println(clazz4); 20 }
运行效果: