JAVA 反射(一)Class類

來源:互聯網
上載者:User

反射提供了程式分析類的能力,利用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類使用中介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.