java 设计模式——反射机制的应用

        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 }

猜你喜欢

转载自www.cnblogs.com/ttting/p/11479139.html