Java反射机制剖析(二)-功能以及举例

来源:互联网 发布:数据分析师待遇 编辑:程序博客网 时间:2024/05/02 01:47

从《java反射机制剖析(一)》的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢?


从上篇API中我们能看到它能够完成下面的这些功能:


1)     获得类

A.     运用getClass()  (每个class都有此函数)

                                    i.    String str = "abc";

                                  ii.    Class c1 = str.getClass();

 

B.     运用Class.forName() (static method 最常被使用)

                                    i.    Class c1 = Class.forName ("java.lang.String");

                                  ii.    Class c2 = Class.forName ("java.awt.Button");

C.     运用  .class 语法

                                    i.    Class c1 = String.class;

                                  ii.    Class c2 = java.awt.Button.class;

                                iii.    Class c4 = int.class;

                                  iv.    Class c5 = int[].class;

D.     运用 TYPE语法 ( primitive wrapper classes 基本数据类型包装类的 TYPE语法)

                                    i.    Class c1 = Boolean.TYPE;

 

2)     获得属性(这个功能的实例见Java反射机制剖析(2))

以下四个方法可以获得属性,主要参见的是Java.lang.class

 

Public  Field  getField

(String name)

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段

public Field[] getFields()

返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

Public  Field

getDeclaredField(String name)

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段

public  Field[]

getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

 

3)     获得方法()

以下四个方法可以获得方法,要参见的是Java.lang.class


public  Method

getMethod(String name,

... )

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

public Method[] getMethods()

返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法

public Method

getDeclaredMethod(String name,…)

返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

public Method[]

getDeclaredMethods()

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

 

4)     获取类的构造器

以下四个方法可以获得方法,要参见的是Java.lang.class


public  Constructor

getConstructor(Class<?>... )

返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法

public  Constructor<?>[]

getConstructors()

返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法

Public  Constructor<T>

getDeclaredConstructor(Class<?>...)

返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

public  Constructor<?>[]

getDeclaredConstructors()

返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

示例代码:

[java] view plaincopyprint?
  1. import java.lang.reflect.Constructor;  
  2.   
  3.   
  4. public class TestConstructor {  
  5.     /** 
  6.      * @param args 
  7.      * @throws ClassNotFoundException  
  8.      * @throws SecurityException  
  9.      * @throws NoSuchMethodException  
  10.      */  
  11.     public static void main(String[] args) throws Exception {  
  12.         // TODO Auto-generated method stub  
  13.         Class classType=Class.forName(args[0]);  
  14.         Constructor Constructor= classType.getConstructor();  
  15.           
  16.             System.out.println(Constructor.toString());  
  17.           
  18.     }  
  19.       
  20.       
  21. }  


 

5)     新建类的实例

 

调用类的Class对象的newInstance方法

示例:

[java] view plaincopyprint?
  1. import java.lang.reflect.Constructor;  
  2.   
  3.   
  4. public class TestConstructor {  
  5.     /** 
  6.      * @param args 
  7.      * @throws ClassNotFoundException  
  8.      * @throws SecurityException  
  9.      * @throws NoSuchMethodException  
  10.      */  
  11.     public static void main(String[] args) throws Exception {  
  12.         // TODO Auto-generated method stub  
  13.         Class classType=Class.forName(args[0]);  
  14.         //Constructor Constructor= classType.getConstructor();  
  15.         Object inst=classType.newInstance();  
  16.         System.out.println(inst);     
  17.     }  
  18. }  


调用默认Constructor对象的newInstance方法

示例:

[java] view plaincopyprint?
  1. import java.lang.reflect.Constructor;  
  2.   
  3.   
  4. public class TestConstructor {  
  5.     /** 
  6.      * @param args 
  7.      * @throws ClassNotFoundException  
  8.      * @throws SecurityException  
  9.      * @throws NoSuchMethodException  
  10.      */  
  11.     public static void main(String[] args) throws Exception {  
  12.         // TODO Auto-generated method stub  
  13.         Class classType=Class.forName(args[0]);  
  14.         Constructor Constructor= classType.getConstructor();  
  15.         Object inst=Constructor.newInstance();  
  16.         System.out.println(inst);     
  17.     }  
  18. }  


调用带参数Constructor对象的newInstance方法

示例:

[java] view plaincopyprint?
  1. Class classType=User.class  
  2. Constructor constructor2 =  
  3.         classType.getDeclaredConstructor(int.class, String.class);  
  4.   
  5. Object inst = constructor2.newInstance(1"123");  
  6.   
  7. System.out.println(inst);  


 

0 0