JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
- Java反射的作用?
假如有两个程序员,一个程序员在写程序的时需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码是不能通过编译的。此时,利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
- Class类的使用
- OOP的世界里,万事万物皆对象。类是谁的对象呢?——类是对象,类是java.lang.Class类的实例对象!There is a class named class.
- 实例:
-
View Code
//有一个类 class Foo { void print() {System.out.println("Foo");} } //在main函数里: public static void main(String[] args) { //Foo这个类也是一个实例对象,Class类的实例对象,如何表示呢 //任何一个类都是Class类的实例对象,这个实例对象有三种表示方式 //1. --实际在告诉我们,任何一个类都有一个隐含的静态成员变量-class Class c1 = Foo.class; //2. 已知该类的对象通过getClass 方法 Foo f1 = new Foo(); Class c2 = f1.getClass(); //c1, c2表示了Foo类的类类型(class type) //指类也是一个对象,是class类的实例对象,这个对象就成为该类的类类型 //不管从c1,c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象 System.out.println(c1 == c2); //true //3. Class c3 = null; try { c3 = Class.forName("com.immoc.reflect.Foo"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(c3 == c2); //true /* * 我们可以通过类的类类型创建对象实例; * 通过c1 or c2 or c3创建Foo类的对象 */ try { Foo foo = (Foo)c1.newInstance(); //需要有无参的构造方法 foo.print(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }