反射提供了程式分析類的能力,利用JAVA的反射機制可以方便完成很多工作,常用到的4個類:
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.Class<T>
java.lang.reflect.Modifier
一.java.lang.Class<T>:
在啟動並執行JAVA程式中維護所有對象的資訊的一個類.Class類沒有公用的構造方法,一個類載入時它的Class對象由虛擬機器自動建立。
通過三種方法可以得到Class對象。
1.getClass方法
2.靜態方法forName獲得類名對應的Class對象
3..class
package test.reflect;public class ReflectionTest {public static void main(String[] args) {//getClass方法DemoClass demo = new DemoClass();Class<?> c1 = demo.getClass();try {//forNameClass<?> c2 = Class.forName("test.reflect.DemoClass");//.classClass<?> c3 = DemoClass.class;System.out.println(c1.getName());System.out.println(c2.getName());System.out.println(c3.getName());} catch (ClassNotFoundException e1) {e1.printStackTrace();}}}class DemoClass {}
結果:
註:一個Class對象實際上表示的是一個類型,而這個類型未必一定是一個類。比如,int是基礎資料型別 (Elementary Data Type)不是類,但是int.class是一個Class類型的對象。虛擬機器為所有的類型維護一個Class類。
Class類一些常用的方法:
getClasses:返回指定類及其父類的所有公用的內部類,介面
getDeclaredClasses:返回指定類的所有內部類,介面
public class ReflectionTest {public static void main(String[] args) {Class<?>[] classes = DemoClass.class.getClasses();for (Class<?> a: classes) {System.out.println(a.getName());}Class<?>[] classes2 = DemoClass.class.getDeclaredClasses();for (Class<?> b: classes2) {System.out.println("Declared:"+b.getName());}}}class DemoClass extends TestClass{public class a {}public interface b {}private class c {}}class TestClass {private class e {}public class d {}}
結果
test.reflect.DemoClass$a
test.reflect.DemoClass$b
test.reflect.TestClass$d
Declared:test.reflect.DemoClass$a
Declared:test.reflect.DemoClass$b
Declared:test.reflect.DemoClass$c
getConstructors() :取得所有的公用構造方法
getDeclaredConstructors() :取得所有的構造方法
getDeclaredConstructor(Class<?>... parameterTypes) :根據指定的參數類型取得所有的公用構造方法
getConstructor(Class<?>... parameterTypes) :根據指定的參數類型取得所有的構造方法
public class ReflectionTest {public static void main(String[] args) {Constructor<?>[] cons = DemoClass.class.getConstructors();for (Constructor<?> a: cons) {System.out.println(a);}Constructor<?>[] cons2 = DemoClass.class.getDeclaredConstructors();for (Constructor<?> a: cons2) {System.out.println("DeclaredConstructors:"+a);}try {Constructor<?>cons3 = DemoClass.class.getConstructor(int.class);Constructor<?>cons4 = DemoClass.class.getDeclaredConstructor(String.class);System.out.println("Constructor:"+cons3);System.out.println("DeclaredConstructor:"+cons4);//可以用Constructor對象的newInstance方法來調用類的構造方法System.out.println("class instance:"+cons4.newInstance("Jim"));} catch (Exception e) {e.printStackTrace();} }}class DemoClass extends TestClass{public DemoClass() {}public DemoClass(int a) {age = a;}DemoClass(String b) {name = b;}@Overridepublic String toString() {return "name="+name+";age="+age;}private String name;private int age;}
結果:
public test.reflect.DemoClass(int)
public test.reflect.DemoClass()
DeclaredConstructors:test.reflect.DemoClass(java.lang.String)
DeclaredConstructors:public test.reflect.DemoClass(int)
DeclaredConstructors:public test.reflect.DemoClass()
Constructor:public test.reflect.DemoClass(int)
DeclaredConstructor:test.reflect.DemoClass(java.lang.String)
class instance:name=Jim;age=0
getModifiers() :取得類的修飾符,以int表示
public class ReflectionTest {public static void main(String[] args) {int modifier = ReflectionTest.class.getModifiers();String m = Modifier.toString(modifier);System.out.println(m);}}
結果:
public
getDeclaredField(String name) :返回指定的field對象
getDeclaredFields() :返回所有field對象
getField(String name) :返回指定的公用field對象
getFields() :返回公用的field對象
這幾個方法往往和Field類的方法配合使用,在下面Filed類使用中介紹
getMethod(String name, Class<?>... parameterTypes) :根據指定的方法名稱和參數類型返回公用方法的Method對象
getMethods() :返回類的所有公用方法的Method對象
getDeclaredMethod(String name, Class<?>... parameterTypes) :根據指定的方法名稱和參數類型返回所有方法的Method對象
getDeclaredMethods() :返回類的所有方法的Method對象
這幾個方法往往和Method類的方法配合使用,在下面Method類使用中介紹