反射机制
2020年12月22日
17:10
注意一下反射机制的定义:
在运行状态中,对于任意一个类都能知道它的方法和属性,都可以调用它的方法和属性。
这种动态机制即是java反射机制。
获取class对象
知道具体类(不会初始化)
1 System.out.println("1"); 2 Class al = TargetObject.class; 3 System.out.println("2"); 4 Class al2 = Class.forName("com.learning.refect.TargetObject"); 5 System.out.println("3"); 6 TargetObject t = new TargetObject(); 7 Class al3 = t.getClass(); 8 System.out.println("4"); 9 Class al4 = ClassLoader.LoadClass("com.learning.refect.TargetObject"); |
上述是4种方法,注意到forName是会默认进行类初始化的,可以通过参数,指定不初始化。初始化,即类的初始化,这一步会运行类的static块和变量初始化的代码。
其他API
1 package com.learning.refect; 3 import java.lang.reflect.Field; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 7 public class Main { 8 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException { 9 /** 10 * 获取TargetObject类的Class对象并且创建TargetObject类实例 11 */ 12 Class<?> tagetClass = Class.forName("com.learning.refect.TargetObject"); 13 TargetObject targetObject = (TargetObject) tagetClass.newInstance(); 14 /** 15 * 获取所有类中所有定义的方法 16 */ 17 Method[] methods = tagetClass.getDeclaredMethods(); 18 for (Method method : methods) { 19 System.out.println(method.getName()); 20 } 21 /** 22 * 获取指定方法并调用 23 */ 24 Method publicMethod = tagetClass.getDeclaredMethod("publicMethod", String.class); 26 publicMethod.invoke(targetObject, "JavaGuide"); 27 /** 28 * 获取指定参数并对参数进行修改 29 */ 30 Field field = tagetClass.getDeclaredField("value"); 31 //为了对类中的参数进行修改我们取消安全检查 32 field.setAccessible(true); 33 field.set(targetObject, "JavaGuide"); 34 /** 35 * 调用 private 方法 36 */ 37 Method privateMethod = tagetClass.getDeclaredMethod("privateMethod"); 38 //为了调用private方法我们取消安全检查 39 privateMethod.setAccessible(true); 40 privateMethod.invoke(targetObject); 41 } 42 } |