反射机制说明
反射机制(Java Reflection)允许程序在执行期间借助于Reflection API取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到。
获取Class对象的方式
- Class.forName(“类路径”);
- 类名.class
- 对象.getClass();
上反射代码
一、测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
public class TestOne {
public String name = "DevRunning";
public TestOne() { System.out.println("这里是无参构造!"); }
public TestOne(String name) { this.name = name; System.out.println("这里是有参构造!"); }
public void easyOne() { System.out.println("hi! this is easyOne!"); }
public void easyTwo(String hello) { System.out.println(hello + "! easyTwo!"); } }
|
二、调用类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import java.lang.reflect.Constructor; import java.lang.reflect.Field;
public class TestMain {
public static void main(String[] args) throws Exception { Class<?> aClass = Class.forName("cn.running.demo.test.TestOne"); Object obj = aClass.newInstance(); Field name = aClass.getField("name"); System.out.println(name.get(obj)); name.set(obj, "_running");
aClass.getMethod("easyOne").invoke(obj); aClass.getMethod("easyTwo", String.class).invoke(obj, "hello");
Constructor<?> constructor = aClass.getConstructor(String.class); Object obj2 = constructor.newInstance("DevRunning"); } }
|
使用反射爆破(直接操作私有的)
setAccessible(true);
一、测试类(属性私有、构造器私有、方法私有)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
public class TestTwo {
private String name = "DevRunning";
private TestTwo() { System.out.println("这里是无参构造!"); }
private TestTwo(String name) { this.name = name; System.out.println("这里是有参构造!"); }
private void easyOne() { System.out.println("hi! this is easyOne!"); }
private void easyTwo(String hello) { System.out.println(hello + "! easyTwo!"); }
}
|
二、调用类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;
public class TestMain {
public static void main(String[] args) throws Exception { Class<?> aClass = Class.forName("cn.running.demo.test.TestTwo"); Constructor<?> noConstructor = aClass.getDeclaredConstructor(); noConstructor.setAccessible(true); Object obj = noConstructor.newInstance();
Field name = aClass.getDeclaredField("name"); name.setAccessible(true); System.out.println(name.get(obj)); name.set(obj, "_running");
Method easyOne = aClass.getDeclaredMethod("easyOne"); easyOne.setAccessible(true); easyOne.invoke(obj);
Method easyTwo = aClass.getDeclaredMethod("easyTwo", String.class); easyTwo.setAccessible(true); easyTwo.invoke(obj, "hello"); Constructor<?> yesConstructor = aClass.getDeclaredConstructor(String.class); yesConstructor.setAccessible(true); yesConstructor.newInstance("DevRunning");
} }
|