反射機(jī)制是什么
反射機(jī)制是在運(yùn)行狀態(tài)中脉漏,對于任意一個類谬擦,都能夠知道這個類的所有屬性和方法房官;對于任意一個對象趾徽,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制翰守。
反射機(jī)制能做什么
反射機(jī)制主要提供了以下功能:
- 行時判斷任意一個對象所屬的類孵奶;
- 在運(yùn)行時構(gòu)造任意一個類的對象;
- 在運(yùn)行時判斷任意一個類所具有的成員變量和方法蜡峰;
- 在運(yùn)行時調(diào)用任意一個對象的方法了袁;
- 生成動態(tài)代理。
反射機(jī)制的相關(guān)API
InterFace 接口
package com.app;
public interface InterFace {
void read() ;
}
Person 類
package com.app;
public class Person implements InterFace {
private String id ;
private String name ;
public String age ;
//構(gòu)造函數(shù)1
public Person( ){
}
//構(gòu)造函數(shù)2
public Person( String id ){
this.id = id ;
}
//構(gòu)造函數(shù)3
public Person( String id , String name ){
this.id = id ;
this.name = name ;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
/**
* 靜態(tài)方法
*/
public static void update(){
}
@Override
public void read() {
}
}
獲取類:3種方法
package com.app;
public class T1 {
public static void main(String[] args) {
//第一種方法:forName
try {
Class<?> class1 = Class.forName("com.app.Person");
System.out.println( class1 );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//第二張方法:class
Class<?> class2 = Person.class;
//第三種方法:getClass
Person person = new Person();
Class<?> class3 = person.getClass();
System.out.println( class2 );
System.out.println( class3 );
}
}
運(yùn)行結(jié)果:
class com.app.Person
class com.app.Person
class com.app.Person
獲取所有的方法:getMethods( )
package com.app;
import java.lang.reflect.Method;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");
//獲取所有的公共的方法
Method[] methods = class1.getMethods() ;
for (Method method : methods) {
System.out.println( method );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
//自定義方法
public static void com.app.Person.update()
public java.lang.String com.app.Person.getName()
public void com.app.Person.read()
public java.lang.String com.app.Person.getId()
public void com.app.Person.setName(java.lang.String)
public void com.app.Person.setId(java.lang.String)
//父類Object類方法
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
獲取所有實現(xiàn)的接口:getInterfaces()
package com.app;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");
//獲取所有的接口
Class<?>[] interS = class1.getInterfaces() ;
for (Class<?> class2 : interS ) {
System.out.println( class2 );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
interface com.app.InterFace
獲取父類:getSuperclass()
package com.app;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");
//獲取父類
Class<?> superclass = class1.getSuperclass() ;
System.out.println( superclass );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
//父類是Object類
class java.lang.Object
獲取所有的構(gòu)造函數(shù):getConstructors()
package com.app;
import java.lang.reflect.Constructor;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");
//獲取所有的構(gòu)造函數(shù)
Constructor<?>[] constructors = class1.getConstructors() ;
for (Constructor<?> constructor : constructors) {
System.out.println( constructor );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
public com.app.Person(java.lang.String,java.lang.String)
public com.app.Person(java.lang.String)
public com.app.Person()
獲取所有的屬性:getDeclaredFields();
package com.app;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");
//取得本類的全部屬性
Field[] field = class1.getDeclaredFields();
for (Field field2 : field) {
System.out.println( field2 );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
private java.lang.String com.app.Person.id
private java.lang.String com.app.Person.name
可以看出屬性的修飾符是: private , 數(shù)據(jù)類型:String 湿颅,名字:id/name
創(chuàng)建實例:newInstance()
package com.app;
public class T1 {
public static void main(String[] args) {
try {
//創(chuàng)建類
Class<?> class1 = Class.forName("com.app.Person");;
//創(chuàng)建實例化:相當(dāng)于 new 了一個對象
Object object = class1.newInstance() ;
//向下轉(zhuǎn)型
Person person = (Person) object ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
歡迎加入學(xué)習(xí)交流群569772982载绿,大家一起學(xué)習(xí)交流。
}