java反射
java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,
對於任意一個對象,都能夠條用她的任意一個方法和屬性,
這種動態的獲取信息以及動態調用對象的方法的功能成爲java的發射機制
package demo.reflect;
import java.lang.reflect.*;
public class ReflectDemo {
/**
* 爲了看清楚Java反射部分代碼,所有異常我都最後拋出來給虛擬機處理
*/
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException, NoSuchMethodException {
System.out.println("demo1:通過Java反射機制得到類的包名和類名");
demo1();
System.out.println("");
System.out.println("demo2:驗證所有的類都是Class類的實例對象");
demo2();
System.out.println("");
System.out.println("demo3:通過Java反射機制,用 Class 創建類對象,這也就是反射存在的意義所在");
demo3();
System.out.println("");
System.out.println("demo4:通過Java反射機制得到一個類的構造函數,並實現創建帶參實例對象");
demo4();
System.out.println("");
System.out.println("demo5:通過Java反射機制操作成員變量, set 和 get");
demo5();
System.out.println("");
System.out.println("demo6:通過Java反射機制得到類的一些屬性:繼承的接口、父類、函數信息、成員信息、類型等");
demo6();
System.out.println("");
System.out.println("demo7:通過Java反射機制調用類方法");
demo7();
System.out.println("");
System.out.println("demo8:通過Java反射機制得到類加載器信息");
demo8();
}
/**
* demo1:通過Java反射機制得到類的包名和類名
*/
public static void demo1() {
Person person = new Person();
System.out.println("包名:" + person.getClass().getPackage().getName());
System.out.println("完整類名:" + person.getClass().getName());
}
/**
* demo2:驗證所有的類都是Class類的實例對象
*/
public static void demo2() throws ClassNotFoundException {
//定義兩個類型都未知的Class,設置初值爲null,看看如何給它們賦值成Person類
Class<?> class1 = null;
Class<?> class2 = null;
//寫法1,可能拋出 ClassNotFoundException 異常,多用這個寫法
class1 = Class.forName("demo.reflect.Person");
System.out.println("寫法1,包名:" + class1.getPackage().getName() + " , 完整類名:" + class1.getName());
//寫法2
class2 = Person.class;
System.out.println("寫法2,包名:" + class2.getPackage().getName() + " , 完整類名:" + class2.getName());
}
/**
* demo3:通過Java反射機制,用 Class 創建類對象,這也就是反射存在的意義所在
*/
public static void demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> class1 = null;
class1 = Class.forName("demo.reflect.Person");
//由於這裏不能帶參數,所以你要實例化的這個類Person,一定要有無參構造函數
Person person = (Person) class1.newInstance();
person.setName("xiaoming");
person.setAge(20);
System.out.println(person.getName() + " , " + person.getAge());
}
/**
* demo4:通過Java反射機制得到一個類的構造函數,並實現創建帶參實例對象
*/
public static void demo4() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> class1 = null;
Person person1 = null;
Person person2 = null;
class1 = Class.forName("demo.reflect.Person");
Constructor<?>[] constructors = class1.getConstructors();
person1 = (Person) constructors[0].newInstance();
person1.setName("xiaoming");
person1.setAge(20);
System.out.println(person1.getName() + " , " + person1.getAge());
person2 = (Person) constructors[1].newInstance(21, "xiaohong");
System.out.println(person2.getName() + " , " + person2.getAge());
}
/**
* demo5:通過Java反射機制操作成員變量, set 和 get
*/
public static void demo5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, SecurityException {
Class<?> class1 = Class.forName("demo.reflect.Person");
Object obj = class1.newInstance();
Field personNameField = class1.getDeclaredField("name");
personNameField.setAccessible(true); //取消訪問檢查
personNameField.set(obj, "小虎");
System.out.println("修改屬性之後得到屬性變量的值:" + personNameField.get(obj));
}
/**
* demo6:通過Java反射機制得到類的一些屬性:繼承的接口、父類、函數信息、成員信息、類型等
*/
public static void demo6() throws ClassNotFoundException {
Class<?> class1 = Class.forName("demo.reflect.SuperMan");
//取得父類名稱
Class<?> superclass = class1.getSuperclass();
System.out.println("SuperMan類的父類名:" + superclass.getName());
Field[] fields = class1.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("類中的成員" + i + ": " + fields[i]);
}
//取得類方法
Method[] methods = class1.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("取得SuperMan類的方法" + i + ":");
System.out.println("函數名:" + methods[i].getName());
System.out.println("函數返回類型:" + methods[i].getReturnType());
System.out.println("函數訪問修飾符:" + Modifier.toString(methods[i].getModifiers()));
System.out.println("函數代碼寫法: " + methods[i]);
}
//取得類實現的接口,因爲接口類也屬於Class,所以得到接口中的方法也是一樣的方法得到哈
Class<?> interfaces[] = class1.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
System.out.println("實現的接口類名: " + interfaces[i].getName());
}
}
/**
* demo7:通過Java反射機制調用類方法
*/
public static void demo7() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class<?> class1 = Class.forName("demo.reflect.SuperMan");
System.out.println("調用無參方法fly():");
Method method = class1.getMethod("fly");
method.invoke(class1.newInstance());
System.out.println("調用有參方法walk(int m):");
method = class1.getMethod("walk", int.class);
method.invoke(class1.newInstance(), 100);
}
/**
* demo8:通過Java反射機制得到類加載器信息
* 在java中有三種類類加載器
* 1)Bootstrap ClassLoader 此加載器採用c++編寫,一般開發中很少見。
* 2)Extension ClassLoader 用來進行擴展類的加載,一般對應的是jre\lib\ext目錄中的類
* 3)AppClassLoader 加載classpath指定的類,是最常用的加載器,同時也是java中默認的加載器。
*/
public static void demo8() throws ClassNotFoundException {
Class<?> class1 = Class.forName("demo.reflect.SuperMan");
String name = class1.getClassLoader().getClass().getName();
System.out.println("類加載器類名:" + name);
}
}
class Person {
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface ActionInterface {
public void walk(int m);
}
class SuperMan extends Person implements ActionInterface {
private boolean blueBriefs;
public void fly() {
System.out.println("超人會飛耶~~");
}
public boolean isBlueBriefs() {
return blueBriefs;
}
public void setBlueBriefs(boolean blueBriefs) {
this.blueBriefs = blueBriefs;
}
@Override
public void walk(int m) {
System.out.println("超人會走耶~~走了" + m + "米就走不動了!");
}
}
理解
例子來自網上,如侵權刪除