
JAVA反射介绍 AVA反射相关API
一.JAVA反射介绍
JAVA反射通常在运行时需要检查或者修改应用程序行为的时候使用,反射是一种强大的技术,可以实现一些在非反射条件下不可能实现的功能。
Debug调试工具利用反射,能够看到类上的私有成员的值。测试工具可以利用反射,系统地调用类上定义的所有方法,以确保白盒测试,达到高水平的代码覆盖率。
package org.example.sourcecode.reflect;import java.lang.reflect.Field;public class FinalFieldClass {public int Value = 5;public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {FinalFieldClass finalField = new FinalFieldClass();Field field = FinalFieldClass.class.getDeclaredField("Value");field.setAccessible(true);field.set(finalField, 100);System.out.println(finalField.Value);}}
直接执行java -cp . org.example.sourcecode.reflect.FinalFieldClass可以正常运行,打印结果100。
Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)at java.security.AccessController.checkPermission(AccessController.java:886)at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:128)at org.example.sourcecode.reflect.FinalFieldClass.main(FinalFieldClass.java:15)
调用Field.setAccessible时,SecurityManager会调用checkPermission进行权限检查,没有权限则抛出AccessControlException。SecurityManager的内容这里就不展开了,后面会单写一篇文章进行讲解。
二.JAVA反射相关API
package org.example.sourcecode.reflect;public class ReflectClass {static {System.out.println("enter static block");}}
public static void main(String[] args) throws Exception {Class clazz = ReflectClass.class;System.out.println(clazz);System.out.println(clazz.getClassLoader());}
class org.example.sourcecode.reflect.ReflectClasssun.misc.Launcher$AppClassLoader@18b4aac2
public static void main(String[] args) throws Exception {Class clazz = new ReflectClass().getClass();System.out.println(clazz);System.out.println(clazz.getClassLoader());}
enter static blockclass org.example.sourcecode.reflect.ReflectClasssun.misc.Launcher$AppClassLoader@18b4aac2
public static void main(String[] args) throws Exception {Class clazz = Class.forName("org.example.sourcecode.reflect.ReflectClass", false, ClassLoader.getSystemClassLoader());System.out.println(clazz);System.out.println(clazz.getClassLoader());}
class org.example.sourcecode.reflect.ReflectClasssun.misc.Launcher$AppClassLoader@18b4aac2
public static void main(String[] args) throws Exception {Class clazz = Class.forName("org.example.sourcecode.reflect.ReflectClass");System.out.println(clazz);System.out.println(clazz.getClassLoader());}
enter static blockclass org.example.sourcecode.reflect.ReflectClasssun.misc.Launcher$AppClassLoader@18b4aac2
public static void main(String[] args) throws Exception {Class clazz = ClassLoader.getSystemClassLoader().loadClass("org.example.sourcecode.reflect.ReflectClass");System.out.println(clazz);System.out.println(clazz.getClassLoader());}
class org.example.sourcecode.reflect.ReflectClasssun.misc.Launcher$AppClassLoader@18b4aac2
package org.example.sourcecode.reflect;import java.lang.reflect.Field;public class FieldTest {public static void main(String[] args) throws Exception {Class clazz = Child.class;display(clazz.getFields());display(clazz.getDeclaredFields());}private static void display(Field[] fields) {for (int i = 0; i < fields.length; i++) {System.out.println(fields[i].getName());}System.out.println();}private static class Parent {private String privateParentField;protected String protectParentField;String defaultParentField;public String publicParentField;}private static class Child extends Parent {private String privateChildField;protected String protectChildField;String defaultChildField;public String publicChildField;}}
publicChildFieldpublicParentFieldprivateChildFieldprotectChildFielddefaultChildFieldpublicChildField
package org.example.sourcecode.reflect;public class FieldValue {private int value;private static int staticValue;}
package org.example.sourcecode.reflect;import java.lang.reflect.Field;public class FieldValueTest {public static void main(String[] args) throws Exception {FieldValue fieldValue = new FieldValue();Field valueField = FieldValue.class.getDeclaredField("value");Field staticValueField = FieldValue.class.getDeclaredField("staticValue");valueField.setAccessible(true);valueField.set(fieldValue, 100);System.out.println(valueField.get(fieldValue));staticValueField.setAccessible(true);staticValueField.set(null, 50);System.out.println(staticValueField.get(null));}}
10050
package org.example.sourcecode.reflect;import java.lang.reflect.Method;public class MethodTest {public static void main(String[] args) {Class clazz = Child.class;display(clazz.getMethods());display(clazz.getDeclaredMethods());}private static void display(Method[] methods) {for (int i = 0; i < methods.length; i++) {System.out.println(methods[i].getName());}System.out.println();}private static class Parent {private void privateParentMethod() {}protected void protectParentMethod() {}void defaultParentMethod() {}public void publicParentMethod() {}}private static class Child extends Parent {private void privateChildMethod() {}protected void protectChildMethod() {}void defaultChildMethod() {}public void publicChildMethod() {}}}
publicChildMethodpublicParentMethodwaitwaitwaitequalstoStringhashCodegetClassnotifynotifyAllprotectChildMethodprivateChildMethoddefaultChildMethodpublicChildMethod
package org.example.sourcecode.reflect;public class MethodInvoke {private void run(String cmd) {System.out.println("private run method : " + cmd);}private static void staticRun(String cmd) {System.out.println("private static run method : " + cmd);}}
package org.example.sourcecode.reflect;import java.lang.reflect.Method;public class MethodInvokeTest {public static void main(String[] args) throws Exception {MethodInvoke methodClass = new MethodInvoke();Method run = methodClass.getClass().getDeclaredMethod("run", new Class[]{String.class});run.setAccessible(true);run.invoke(methodClass, "delete");Method staticRun = methodClass.getClass().getDeclaredMethod("staticRun", new Class[]{String.class});staticRun.setAccessible(true);staticRun.invoke(null, "query");}}
private run method : deleteprivate static run method : query
package org.example.sourcecode.reflect;import java.lang.reflect.Constructor;public class ConstructorTest {public static void main(String[] args) {Class clazz = Child.class;display(clazz.getConstructors());display(clazz.getDeclaredConstructors());}private static void display(Constructor[] constructors) {for (int i = 0; i < constructors.length; i++) {System.out.print(constructors[i].getName() + " : ");displayParameterTypes(constructors[i].getParameterTypes());}System.out.println();}private static void displayParameterTypes(Class[] parameterTypes) {for (int i = 0; i < parameterTypes.length; i++) {System.out.print(parameterTypes[i] + "\t");}System.out.println();}private static class Parent {private Parent() {}protected Parent(byte a) {}Parent(short a) {}public Parent(int a) {}}private static class Child extends Parent {private Child() {}protected Child(byte a) {}Child(short a) {}public Child(int a) {}}}
org.example.sourcecode.reflect.ConstructorTest$Child : intorg.example.sourcecode.reflect.ConstructorTest$Child : intorg.example.sourcecode.reflect.ConstructorTest$Child : shortorg.example.sourcecode.reflect.ConstructorTest$Child : byteorg.example.sourcecode.reflect.ConstructorTest$Child :
package org.example.sourcecode.reflect;import java.lang.reflect.Constructor;public class ConstructorInvokeTest {public static void main(String[] args) throws Exception {Class clazz = Child.class;Constructor constructorDefault = clazz.getDeclaredConstructor(new Class[0]);constructorDefault.setAccessible(true);Child child = (Child) constructorDefault.newInstance();System.out.println(child);Constructor constructorInt = clazz.getDeclaredConstructor(new Class[]{int.class});Child childInt = (Child) constructorInt.newInstance(1);System.out.println(childInt);Constructor constructorShort = clazz.getDeclaredConstructor(new Class[]{short.class});Child childShort = (Child) constructorShort.newInstance((short) 1);System.out.println(childShort);}private static class Child {private Child() {}protected Child(byte a) {}Child(short a) {}public Child(int a) {}}}


文章转载自马士兵,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




