新手了解java 反射基礎(chǔ)知識
一、反射概述
Reflection(反射)是被視為動態(tài)語言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意 對象的內(nèi)部屬性及方法。 加載完類之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個(gè)Class類型的對象 (一個(gè)類只有一個(gè)Class對象),這個(gè)對象就包含了完整的類的結(jié)構(gòu)信 息。我們可以通過這個(gè)對象看到類的結(jié)構(gòu),這個(gè)對象就像一面鏡子,透 過這個(gè)鏡子看到類的結(jié)構(gòu),所以我們形象的稱之為反射。
二、常用api
java.lang.Class:代表一個(gè)類
java.lang.reflect.Method:代表類的方法
java.lang.reflect.Field:代表類的成員變量
java.lang.reflect.Constructor:代表類的構(gòu)造器
static Class forName(String name) 返回指定類名 name 的 Class 對象
Object newInstance() 調(diào)用無參構(gòu)造函數(shù),返回該Class對象 的一個(gè)實(shí)例
getName() 返回此Class對象所表示的實(shí)體(類、 接口、數(shù)組類、基本類型或void)名稱
Class getSuperClass() 返回當(dāng)前Class對象的父類的Class對象
Class [] getInterfaces() 獲取當(dāng)前Class對象的接口
ClassLoader getClassLoader() 返回該類的類加載器
Class getSuperclass() 返回表示此Class所表示的實(shí)體的超類的Class
Constructor[] getConstructors() 返回一個(gè)包含某些Constructor對象的數(shù)組
Field[] getDeclaredFields() 返回Field對象的一個(gè)數(shù)組 Method
getMethod(String name,Class … paramTypes) 返回一個(gè)Method對象,此對象的形參類型為paramType
示例:
public class Person {
private String name;
private int age;
public Person() {
System.out.println("Person類被初始化了。。。。。^_^");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
反射
public class ClassDemo {
public static void main(String[] args) throws
Exception {
// 1. 創(chuàng)建Class對象
//Class<Person> clazz = (Class<Person>)
Class.forName("Person");
Class<?> clazz =Class.forName("Person");
// 2. 通過Class對象調(diào)用其方法
// 2.1. 通過反射來實(shí)例化對象
//Person person = clazz.newInstance();
Object o = clazz.newInstance(); // 此名就相當(dāng)于
Person p = new Person()
// 2.2. 獲取類的完整類名稱(包名+類名)
String name = clazz.getName();
System.out.println(name);
// 2.3. 獲取類的簡單名稱,就是類的名稱,不含包名
System.out.println(clazz.getSimpleName());
// 2.4. 獲取構(gòu)造器
Constructor<?>[] constructors =
clazz.getConstructors();
for (Constructor<?> constructor :
constructors) {
System.out.println(constructor.getName());
}
// 2.5. 獲取字段
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// 2.6. 獲取方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
}
三、創(chuàng)建Class對象的四種方式
public class Demo {
public static void main(String[] args) throws
Exception {
// 第一種方式:調(diào)用Class.forName()
Class clazz =Class.forName("java.lang.String");
// 第二種方式:通過類的字節(jié)碼文件來創(chuàng)建
Class clazz1 = String.class;
// 第三種方式:通過調(diào)用對象的getClass()方法來創(chuàng)建
String str = new String();
Class clazz2 = str.getClass();
// 第四種:通過類裝載器來創(chuàng)建
ClassLoader loader =String.class.getClassLoader();
Class<?> clazz3 =loader.loadClass("java.lang.String");
}
}
總結(jié)
本篇文章就到這里了,希望對你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
靜態(tài)方法中調(diào)用Spring注入過程解析
這篇文章主要介紹了靜態(tài)方法中調(diào)用Spring注入過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
java 實(shí)現(xiàn)回調(diào)代碼實(shí)例
本文主要介紹Java的回調(diào)機(jī)制,并附實(shí)例代碼以供大家參考學(xué)習(xí),有需要的小伙伴可以看下2016-07-07
Java編程基于快速排序的三個(gè)算法題實(shí)例代碼
這篇文章主要介紹了Java編程基于快速排序的三個(gè)算法題實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例
本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

