1. 程式人生 > 遊戲 >《採石場驚魂》擁有電影模式 全程不需要任何操作

《採石場驚魂》擁有電影模式 全程不需要任何操作

Java反射

一,前言

​ 理解反射的概念,掌握4個反射相關的類,掌握例項化方式和常用方法,掌握反射例項化物件在實操中的使用。

二,反射的概念

​ 反射(Reflection),它允許在執行中的Java程式獲取自身的資訊,並且可以操作類或者物件的內部屬性。

(java.lang):Class

(java.lang.reflect):Field,Method,Constructor

三,反射相關的類

1.Class類

概念:

​ Class,類物件,描述的是類的資訊(注意,描述的是類,而不是物件)。

三種例項化方式:

//方式一:呼叫執行時類的屬性:.class
Class clazz1 = Person.class;

//方式二:呼叫執行時類的物件,呼叫getClass()
Person p1 = new Person();
Clss clazz2 = p1.getClass();

//方式三:呼叫Class的靜態方法:forName(String classPath)
Class clazz3 = Class.ForName("com.xxx.xxx.Person");

通過反射建立執行時類的物件:

//呼叫newInstance方法建立物件
Person obj = (Person)clazz.newInstance();
//注:1.執行時類必須提供空參構造器 2.空參構造器的訪問許可權足夠

常用方法:

//獲取執行時類的父類
Class superclass = clazz.getSuperclass();
//獲取執行時類實現的介面
Class[] interfaces = clazz.getInterfaces();
//獲取執行時類所在的包
Package pack = clazz.getPackage();
//獲取執行時類宣告的註解
Annotation[] annotations = clazz.getAnnotations();

// 獲取類的所有許可權為public的變數(包括該類和超類或者超介面)
public Field[] getFields() throws SecurityException {}
// 獲取本類的所有變數
public Field[] getDeclaredFields() throws SecurityException {}

// 獲取類的所有許可權為public的方法(包括該類和超類或者超介面)
public Method[] getMethods() throws SecurityException {}
// 獲取本類的所有成員方法
public Method[] getDeclaredMethods() throws SecurityException {}

// 獲取類的所有許可權為public的構造方法
public Constructor<?>[] getConstructors() throws SecurityException {}
// 獲取本類的所有構造方法
public Constructor<?>[] getDeclaredConstructors() throws SecurityException {}

// 根據類物件獲取類名
public String getName() {}

// 判斷當前的類是否是介面
public native boolean isInterface();
// 判斷當前的類是否是陣列類
public native boolean isArray();
// 判斷當前的類是否是註解類
public boolean isAnnotation() {}

2.Field類

概念:

​ Field,翻譯過來就是欄位,代表的是類的成員變數。

例項化方式:

//獲取當前執行時類及其父類中宣告為public訪問許可權的屬性
Field[] fields = clazz.getFields();
for(Field f : fields){
    System.out.println(f);
}

//獲取當前執行時類中宣告的所有屬性。(不包含父類中宣告的屬性)
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f : declaredFields){
    System.out.println(f);
}

常用方法:

//獲取許可權修飾符(返回整理型別,java.lang.reflect.Modifier中有定義常量)
int modifier = f.getModifiers();
System.out.println(modifier.toString());

//獲取資料型別
Class type = f.getType();
String typename = type.getName();

//獲取變數名
String name = f.getName();

// 設定物件obj對應的屬性的值為value
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException {}

// 獲取物件obj對應的屬性值
public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException {}

3.Method類

概念:

​ Method,翻譯過來就是方法的意思,代表的是類的成員方法。

例項化方式:

//獲取當前執行時類及其所有父類中宣告為public許可權的方法
Method[] methods = clazz.getMethods();
for(Method m : methods){
    System.out.println(m);
}

//獲取當前執行時類中宣告的所有屬性。(不包含父類中宣告的屬性)
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m : declaredMethods){
    System.out.println(m);
}

常用方法:

//獲取註解
Annotation[] annos = m.getAnnotations();

//獲取許可權修飾符
int modifier = m.getModifiers();
System.out.println(modifier.toString());

//獲取返回值型別
m.getReturnType().getName();

//獲取方法名(引數型別1 形參名1,....)
String name = m.getName();

//獲取方法中形參列表
Class[] parameterTypes= m.getParameterTypes();
if(!(parameterTypes == null && parameterTypes.length ==0)){
    for(int i = 0;i < parameterTypes.length;i++){
    System.out,println(parameterTypes[i].getName() + "args_" + i);
	}
}

//獲取異常型別
Class[] exceptionTypes = m.getExceptionTypes();

4.Constructor類

概念:

​ Constructor,翻譯過來就是建構函式的意思,代表的就是類的建構函式。

例項化方式:

//獲取當前執行時類中宣告為public的構造器
Constructor[] Constructors = clazz.getConstructors();
for(Constructor c : Constructors){
    System.out.println(c);
}

//獲取當前執行時類中宣告的所有的構造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor c : declaredConstructors){
    System.out.println(c);
}

四,反射例項化物件的使用

1.執行時類給指定屬性賦值

//建立執行時類的物件
Person p = (Person) clazz.newInstance();
//建立執行時類的屬性的物件
Field name = clazz.getDeclaredField(name);
//開放許可權,保證訪問
name.setAccessible(true);
//給指定物件賦值
name.set(p,"Tom");

2.執行時類使用指定方法

//建立執行時類的物件
Person p = (Person) clazz.newInstance();
//建立執行時類的方法物件
Method show = Clazz.getDeclaredMethod(show,String.class)
//開放許可權,保證訪問
show.setAccessible(true);
//呼叫方法
Method.invoke(p,"方法需給的傳參");

3.執行時類使用指定的構造器

//獲取指定的構造器,並給定構造需要的屬性的反射類
Construtor construtor = clazz.getDeclaredConstrutor(String.class);
//開放許可權,保證訪問
construtor.setAccessible(true);
//構造器呼叫方法建立執行時類的物件
Person per = construtor.newInstance("構造屬性值");