本文共 3805 字,大约阅读时间需要 12 分钟。
.reverseTranslate {font-family: Arial, sans-serif;line-height: 1.6;margin: 20px 0;}
反射(Reflection)是Java中非常重要的一项机制,也称为 reflection。它使Java在运行时对自身进行检查,并能够直接操作程序的内部属性或方法。
反射API中包含大量关于Java元数据的信息,包括:package、type parameters、superclass、implemented interfaces、inner classes、outer classes、fields、constructors、methods、modifiers等。常用的类包括:
Class类是反射机制的起始点,获取Class对象的方式有多种:
Class cl = str.getClass();
。Class clsup = cl.getSuperClass();
。Class cl2 = Class.forName("java.lang.String");
。Class cl3 = String.Class;
。Class cl4 = Integer.TYPE;
。Class类的重要方法包括:
public static Class forName(String className)
:动态加载类。public T newInstance()
:根据类创建新实例。public ClassLoader getClassLoader()
:获取类的类加载器。public String getName()
:获取类的名称。public native Class getSuperclass()
:获取类的父类。public java.net.URL getResource(String name)
:获取资源路径。Constructor类用于反射类的构造器信息,常用的方法包括:
Constructor getConstructor(Class[] params)
:根据参数类型获取构造器。Constructor[] getConstructors()
:获取所有公共和非公constructors。Constructor getDeclaredConstructor(Class[] params)
:获取指定参数的声明构造器。Constructor[] getDeclaredConstructors()
:获取所有声明的构造器。Constructor类的重要方法包括:
public String getName()
:获取构造器名称。public native int getModifiers()
:获取修饰符。public Class[] getParameterTypes()
:获取参数类型。public Object newInstance(Object... initargs)
:创建新实例。Method类用于反射类和接口的方法信息,常用的方法包括:
Method getMethod(String name, Class[] params)
:获取指定名称和参数的方法。Method[] getMethods()
:获取所有公方法,包括继承的和接口的。Method getDeclaredMethod(String name, Class[] params)
:获取指定名称和参数的声明方法。Method[] getDeclaredMethods()
:获取该类所有声明方法。Method类的重要方法包括:
public String getName()
:获取方法名称。public native int getModifiers()
:获取修饰符。public Class[] getParameterTypes()
:获取参数类型。public Object invoke(Object obj, Object... args)
:调用目标对象的方法。Field类用于反射类和接口的属性信息,常用的方法包括:
Field getField(String name)
:获取指定名称的属性字段。Field[] getFields()
:获取所有公属性字段。Field getDeclaredField(String name)
:获取指定名称的声明属性字段。Field[] getDeclaredFields()
:获取该类所有声明属性字段。Field类的重要方法包括:
public String getName()
:获取字段名称。public native int getModifiers()
:获取字段修饰符。public Class getType()
:获取字段类型。public Object get(Object obj)
:获取指定对象的字段值。以下是一个通过反射反射阿里巴巴样例代码的示例:
package net.peace.ref;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Stack;public class TestRef { public static void main(String[] args) { try { Class c = Class.forName("java.util.Stack"); Method[] ms = c.getDeclaredMethods(); for (Method m : ms) { System.out.println(m.getModifiers() + " " + m.getReturnType() + " " + m.getName()); Class[] cc = m.getParameterTypes(); for (Class p : cc) { System.out.println(p.getName()); } Class[] ce = m.getExceptionTypes(); for (Class p : ce) { System.out.println(p.getName()); } } System.out.println("******************************"); Constructor[] con = c.getDeclaredConstructors(); for (Constructor p : con) { System.out.println(p); } System.out.println("******************************"); Field[] field = c.getDeclaredFields(); for (Field f : field) { System.out.println(f); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }}
上述代码展示了如何通过反射获取Stack类的方法、构造器和字段,并动态创建Stack对象、调用Stack方法、设置Stack字段值等操作。
转载地址:http://kiryk.baihongyu.com/