是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
动态获取类中信息,就是java反射 。可以理解为对类的解剖。
反射机制图解说明:
先创建一个字节码文件:
public class Person { private int age; private String name; public Person(String name,int age) { super(); this.age = age; this.name = name; System.out.println("Person param run..."+this.name+":"+this.age); } public Person() { super(); System.out.println("person run"); } public void show(){ System.out.println(name+"...show run..."+age); } private void privateMethod(){ System.out.println(" method run "); } public void paramMethod(String str,int num){ System.out.println("paramMethod run....."+str+":"+num); } public static void staticMethod(){ System.out.println(" static method run......"); } }
要想要对字节码文件进行解剖,必须要有字节码文件对象.如何获取字节码文件对象呢
获取字节码对象的第一种方式:Object类中的getClass()方法的。
import com.itfd.fanshe.Person; public class ReflectDemo { public static void main(String[] args) { getClassObject(); } public static void getClassObject(){ Person p = new Person(); Class clazz = p.getClass(); Person p1 = new Person(); Class clazz1 = p1.getClass(); System.out.println(clazz==clazz1); } }
想要用这种方式,必须要明确具体的类,并创建对象。比较麻烦 .
获取字节码对象的第二种方式:任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
import com.itfd.fanshe.Person; public class ReflectDemo { public static void main(String[] args) { getClassObject(); } public static void getClassObject() { Class clazz = Person.class; Class clazz1 = Person.class; System.out.println(clazz==clazz1); } }
相对简单,但是还是要明确用到类中的静态成员。这种方式还是不够扩展。
获取字节码对象的第三种方式:只要通过给定的类的 字符串名称就可以获取该类,更为扩展。可是用Class类中的方法完成。该方法就是forName.
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { getClassObject(); } public static void getClassObject() throws ClassNotFoundException { String className = "com.itfd.fanshe.Person"; Class clazz = Class.forName(className); System.out.println(clazz); } }
这种方式只要有名称即可,更为方便,扩展性更强。