2.4反射擷取成員變量并使用【應用】
2.4.1Class類擷取成員變量對象的方法
方法名 | 說明 |
Field[] getFields() | 傳回所有公共成員變量對象的數組 |
Field[] getDeclaredFields() | 傳回所有成員變量對象的數組 |
Field getField(String name) | 傳回單個公共成員變量對象 |
Field getDeclaredField(String name) | 傳回單個成員變量對象 |
public class Student {
public String name;
public int age;
public String gender;
private int money = 300;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", money=" + money +
'}';
}
}
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
// method1();
//method2();
//method3();
//method4();
}
private static void method4() throws ClassNotFoundException, NoSuchFieldException {
// Field getDeclaredField(String name):傳回單個成員變量對象
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取money成員變量
Field field = clazz.getDeclaredField("money");
//3.列印一下
System.out.println(field);
}
private static void method3() throws ClassNotFoundException, NoSuchFieldException {
// Field getField(String name):傳回單個公共成員變量對象
//想要擷取的成員變量必須是真實存在的
//且必須是public修飾的.
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取name這個成員變量
//Field field = clazz.getField("name");
//Field field = clazz.getField("name1");
Field field = clazz.getField("money");
//3.列印一下
System.out.println(field);
}
private static void method2() throws ClassNotFoundException {
// Field[] getDeclaredFields():傳回所有成員變量對象的數組
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取所有的Field對象
Field[] fields = clazz.getDeclaredFields();
//3.周遊
for (Field field : fields) {
System.out.println(field);
}
}
private static void method1() throws ClassNotFoundException {
// Field[] getFields():傳回所有公共成員變量對象的數組
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取Field對象.
Field[] fields = clazz.getFields();
//3.周遊
for (Field field : fields) {
System.out.println(field);
}
}
}
2.4.2Field類用于給成員變量指派的方法
方法名 | 說明 |
void set(Object obj, Object value) | 指派 |
Object get(Object obj) | 擷取值 |
// Student類同上一個示例,這裡就不在重複提供了
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
// Object get(Object obj) 傳回由該 Field表示的字段在指定對象上的值。
//method1();
//method2();
}
private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取成員變量Field的對象
Field field = clazz.getDeclaredField("money");
//3.取消一下通路檢查
field.setAccessible(true);
//4.調用get方法來擷取值
//4.1建立一個對象
Student student = (Student) clazz.newInstance();
//4.2擷取指定對象的money的值
Object o = field.get(student);
//5.列印一下
System.out.println(o);
}
private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
// void set(Object obj, Object value):給obj對象的成員變量指派為value
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.擷取name這個Field對象
Field field = clazz.getField("name");
//3.利用set方法進行指派.
//3.1先建立一個Student對象
Student student = (Student) clazz.newInstance();
//3.2有了對象才可以給指定對象進行指派
field.set(student,"zhangsan");
System.out.println(student);
}
}
2.5反射擷取成員方法并使用【應用】
2.5.1Class類擷取成員方法對象的方法
方法名 | 說明 |
Method[] getMethods() | 傳回所有公共成員方法對象的數組,包括繼承的 |
Method[] getDeclaredMethods() | 傳回所有成員方法對象的數組,不包括繼承的 |
Method getMethod(String name, Class<?>… parameterTypes) | 傳回單個公共成員方法對象 |
Method getDeclaredMethod(String name, Class<?>… parameterTypes) | 傳回單個成員方法對象 |
public class Student {
//私有的,無參無傳回值
private void show() {
System.out.println("私有的show方法,無參無傳回值");
}
//公共的,無參無傳回值
public void function1() {
System.out.println("function1方法,無參無傳回值");
}
//公共的,有參無傳回值
public void function2(String name) {
System.out.println("function2方法,有參無傳回值,參數為" + name);
}
//公共的,無參有傳回值
public String function3() {
System.out.println("function3方法,無參有傳回值");
return "aaa";
}
//公共的,有參有傳回值
public String function4(String name) {
System.out.println("function4方法,有參有傳回值,參數為" + name);
return "aaa";
}
}
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//method1();
//method2();
//method3();
//method4();
//method5();
}
private static void method5() throws ClassNotFoundException, NoSuchMethodException {
// Method getDeclaredMethod(String name, Class<?>... parameterTypes):
// 傳回單個成員方法對象
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取一個成員方法show
Method method = clazz.getDeclaredMethod("show");
//3.列印一下
System.out.println(method);
}
private static void method4() throws ClassNotFoundException, NoSuchMethodException {
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取一個有形參的方法function2
Method method = clazz.getMethod("function2", String.class);
//3.列印一下
System.out.println(method);
}
private static void method3() throws ClassNotFoundException, NoSuchMethodException {
// Method getMethod(String name, Class<?>... parameterTypes) :
// 傳回單個公共成員方法對象
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取成員方法function1
Method method1 = clazz.getMethod("function1");
//3.列印一下
System.out.println(method1);
}
private static void method2() throws ClassNotFoundException {
// Method[] getDeclaredMethods():
// 傳回所有成員方法對象的數組,不包括繼承的
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取Method對象
Method[] methods = clazz.getDeclaredMethods();
//3.周遊一下數組
for (Method method : methods) {
System.out.println(method);
}
}
private static void method1() throws ClassNotFoundException {
// Method[] getMethods():傳回所有公共成員方法對象的數組,包括繼承的
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取成員方法對象
Method[] methods = clazz.getMethods();
//3.周遊
for (Method method : methods) {
System.out.println(method);
}
}
}
2.5.2Method類用于執行方法的方法
方法名 | 說明 |
Object invoke(Object obj, Object… args) | 運作方法 |
參數一: 用obj對象調用該方法
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
// Object invoke(Object obj, Object... args):運作方法
// 參數一:用obj對象調用該方法
// 參數二:調用方法的傳遞的參數(如果沒有就不寫)
// 傳回值:方法的傳回值(如果沒有就不寫)
//1.擷取class對象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.擷取裡面的Method對象 function4
Method method = clazz.getMethod("function4", String.class);
//3.運作function4方法就可以了
//3.1建立一個Student對象,當做方法的調用者
Student student = (Student) clazz.newInstance();
//3.2運作方法
Object result = method.invoke(student, "zhangsan");
//4.列印一下傳回值
System.out.println(result);
}
}