Java反射机制剖析:功能以及举例

开发 后端
从《Java反射机制剖析:定义和API》的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢

《Java反射机制剖析:定义和API》的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.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 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

示例代码:

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

5) 新建类的实例

调用类的Class对象的newInstance方法

  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.     }  

调用默认Constructor对象的newInstance方法

  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.     }  

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

  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); 

原文链接:http://blog.csdn.net/lfsf802/article/details/7239711

【编辑推荐】

  1. Java反射机制剖析:定义和API
  2. Java远程方法调用RMI
  3. Java处理字符串搜索嵌套结构的方法
  4. Java编程:常见问题汇总
  5. Java迷题:等于,还是不等于?
责任编辑:林师授 来源: lfsf802的博客
相关推荐

2012-02-08 10:12:19

Java反射

2010-09-17 12:39:51

JAVA反射机制

2012-02-08 09:44:52

Java反射

2012-02-08 10:37:42

Java反射

2010-09-17 13:02:11

JAVA反射机制

2010-07-13 16:24:55

SQL Server快

2010-02-22 15:01:26

智能交换机

2012-04-05 13:50:38

Java

2017-05-17 15:28:15

Java反射机制

2017-03-24 09:44:33

Java反射机制

2011-03-09 09:11:52

java反射机制

2011-09-27 10:23:24

Java反射机制

2009-06-17 13:57:54

java实例Reflection

2011-04-01 14:50:56

Java的反射机制

2020-09-16 07:00:00

Android 11AndroidAndroid

2022-10-21 14:12:06

2022-06-08 06:38:00

iPadOS 16SafariiCloud

2023-11-01 13:48:00

反射java

2020-04-27 07:28:00

Java反射动态代理

2010-08-11 09:40:44

LINQ
点赞
收藏

51CTO技术栈公众号