新手了解java 反射基礎知識
一、反射概述
Reflection(反射)是被視為動態(tài)語言的關鍵,反射機制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意 對象的內(nèi)部屬性及方法。 加載完類之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個Class類型的對象 (一個類只有一個Class對象),這個對象就包含了完整的類的結構信 息。我們可以通過這個對象看到類的結構,這個對象就像一面鏡子,透 過這個鏡子看到類的結構,所以我們形象的稱之為反射。
二、常用api
java.lang.Class:代表一個類
java.lang.reflect.Method:代表類的方法
java.lang.reflect.Field:代表類的成員變量
java.lang.reflect.Constructor:代表類的構造器
static Class forName(String name) 返回指定類名 name 的 Class 對象
Object newInstance() 調(diào)用無參構造函數(shù),返回該Class對象 的一個實例
getName() 返回此Class對象所表示的實體(類、 接口、數(shù)組類、基本類型或void)名稱
Class getSuperClass() 返回當前Class對象的父類的Class對象
Class [] getInterfaces() 獲取當前Class對象的接口
ClassLoader getClassLoader() 返回該類的類加載器
Class getSuperclass() 返回表示此Class所表示的實體的超類的Class
Constructor[] getConstructors() 返回一個包含某些Constructor對象的數(shù)組
Field[] getDeclaredFields() 返回Field對象的一個數(shù)組 Method
getMethod(String name,Class … paramTypes) 返回一個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. 通過反射來實例化對象
//Person person = clazz.newInstance();
Object o = clazz.newInstance(); // 此名就相當于
Person p = new Person()
// 2.2. 獲取類的完整類名稱(包名+類名)
String name = clazz.getName();
System.out.println(name);
// 2.3. 獲取類的簡單名稱,就是類的名稱,不含包名
System.out.println(clazz.getSimpleName());
// 2.4. 獲取構造器
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");
}
}
總結
本篇文章就到這里了,希望對你有所幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn)
這篇文章主要介紹了SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
靜態(tài)方法中調(diào)用Spring注入過程解析
這篇文章主要介紹了靜態(tài)方法中調(diào)用Spring注入過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11

