Java反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
class是一个类,通过类名获取反射机制。
一、
import java.lang.reflect.*; class A{ public A(){ System.out.println("A()"); } public A(int m,String n){ System.out.println("A(int m,String n)"); } public A(int m){} } public class test { public static void main(String[] args) throws Exception { Class c = Class.forName("A"); //反射机制 Constructor con[]=c.getConstructors(); //定义Constructor类型的con数组,用来承装A类的构造函数 con[0].newInstance(); //顺序与构造函数顺序对应 con[1].newInstance(12,"hai"); } }
运行结果如下
二、
Constructor con=c.getConstructor(int.class,String.class); 创建指定构造函数对象con:通过参数不同,获取构造函数 con.newInstance(200,"hello"); 调用newInstance()函数新建对象
import java.lang.reflect.*; class A{ public A(){ System.out.println("A()"); } public A(int m,String n){ System.out.println(m+":"+n); } public A(int m){} } public class test { public static void main(String[] args) throws Exception { Class c = Class.forName("A"); //反射机制 Constructor con=c.getConstructor(int.class,String.class); //通过参数指向制定构造函数 con.newInstance(200,"hello"); } }
结果如下:
三、具体应用
1 import java.lang.reflect.*; 2 import java.util.Scanner; 3 interface IShape{ 4 void input(); 5 double getArea(); 6 } 7 class Circle implements IShape{ 8 double r; 9 public Circle(){} 10 public void input(){ 11 System.out.println("please input r:"); 12 Scanner sc = new Scanner(System.in); 13 r = sc.nextDouble(); 14 } 15 public double getArea(){ 16 return 3.14*r*r; 17 } 18 19 } 20 class Rect implements IShape{ 21 double h,w; 22 public Rect(){} 23 public double getArea(){ 24 return h*w; 25 } 26 public void input(){ 27 System.out.println("please input h,w:"); 28 Scanner sc = new Scanner(System.in); 29 h = sc.nextDouble(); 30 w = sc.nextDouble(); 31 32 } 33 } 34 35 public class test { 36 public static void main(String[] args) throws Exception { 37 /*Circle c = new Circle(); //这样写是没有问题的,但是没有应用反射机制 38 c.input(); 39 double area = c.getArea(); 40 System.out.println("area="+area); 41 */ 42 43 /* Class c = Class.forName("Circle"); //这样写没有问题,也应用了反射机制,但该方法不是最优 44 //因为如果要计算Rect的面积,就得把所有的Circle全都改成Rect,麻烦,所以应用接口 45 Circle obj = (Circle)c.newInstance(); 46 obj.input(); 47 double area = obj.getArea(); 48 System.out.println("area="+area); 49 */ 50 Class c = Class.forName("Circle"); //这样只需要改名字就好了 51 IShape obj = (IShape)c.newInstance(); 52 obj.input(); 53 double area = obj.getArea(); 54 System.out.println("area="+area); 55 56 57 58 } 59 60 }