Java 反射

在java中,只要给定类的名字,就可以利用反射机制来获得类的信息,类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字。

java 反射是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifiers( 诸如 public, static 等 )、superclass (例如 Object)、 实现之 interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。

Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 classes。 换言之,Java 可以加载一个运行时才得知名称的 class,获得其完整结构。

在jdk中,主要由以下类来实现java反射机制,这些类都位于java.lang.reflect包中。

1.Class类:代表一个类

2.Constructor类:代表类的构造方法

3.Field类:代表类的成员变量(成员变量也称为类的属性)

4.Method类:代表类的方法

运用上面的Class,Constructor,Field,Method四个类,就可以解析无穷多的系统类和自定义结构。

下面是具体的代码demo

这是被测试类A

 1 package cn.yonyong.reflect.demo;
 2 /**
 3  * 
 4  * @author yonyong
 5  *
 6  */
 7 public class A {
 8     private int num;
 9     public A(){
10         super();
11     }
12     
13     public A(int num)
14     {
15         super();
16         this.num=num;
17     }
18     
19     public void func1(){}
20     public void func2(){}
21 }

测试类

 1 package cn.yonyong.reflect.demo;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 
 7 public class Test {
 8     public static void main(String[] args) throws ClassNotFoundException {
 9 //        1.加载并实例化制定类A
10     
11         Class classInfo=Class.forName("cn.yonyong.reflect.demo.A");
12         
13 //        2.获取类A的构造方法
14         Constructor cons[]=classInfo.getConstructors();
15         
16         System.out.println("类A的构造方法如下所示:");
17         for(int i=0;i<cons.length;i++)
18         {
19             System.out.println(cons[i].toString());
20         }
21         
22         System.out.println();
23         
24 //        3.获取类A的属性
25         Field fields[]=classInfo.getDeclaredFields();
26         System.out.println("类A的属性如下所示:");
27         
28         for(int i=0;i<fields.length;i++)
29         {
30             System.out.println(fields[i].toString());
31         }
32         
33 //        4.获取类A的普通方法
34         System.out.println();
35         Method methods[]=classInfo.getDeclaredMethods();
36         System.out.println("类A的普通方法如下所示:");
37         for(int i=0;i<methods.length;i++)
38         {
39             System.out.println(methods[i].toString());
40         }
41     }
42 }

注意在测试类的11行,需要导入A的路径。如果只是A的话会报ClassNotFound异常。

原文地址:https://www.cnblogs.com/yonyong/p/8572068.html