上周上课老师点我起来回答问题,问了一下JAVA反射机制,我本来对JAVA用得不多,加上有一段时间没有看过了,所以并没有能够答出来,之后就想要好好理解理解,加上老师布置作业让弄懂JAVA反射和Class类,所以优快云第一次写博客,就来写写我对反射和Class的学习之后的感受吧。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一.什么是JAVA的反射机制。
JAVA反射是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制。简单说来,就是可以在程序运行过程中得到刚刚知道的一个类的内部结构。就像老师所说的,反射是和动态挂钩的,反射就意味着我们可以动态地获取信息,动态地调用,创建对象。
在这里还是先给出一个简单的例子让大家稍微熟悉一下。也方便接下来Class的学习。
import java.util.Scanner; import java.lang.reflect.Method; public class ClassForName { public ClassForName(){ try { Scanner inScanner = new Scanner(System.in); Class<?> classinstance=Class.forName(inScanner.next()); //根据输入返回一个类对象 Method[] method=classinstance.getDeclaredMethods();//利用得到的Class对象,返回该类对象的方法集合 System.out.println("forName:"+classinstance); for(Method me:method){ System.out.println("方法有:"+me.toString()); }//输出所有方法的名称 }catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { new ClassForName(); } }
这里给出这个例子的输出,当我输入java.lang.Class时,返回所有方法,输出为:方法有:private java.lang.Object java.lang.Class.newInstance0() throws java.lang.InstantiationException,java.lang.IllegalAccessException
方法有:public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException
方法有:public static java.lang.Class java.lang.Class.forName(java.lang.String) throws java.lang.ClassNotFoundException
方法有:private static native java.lang.Class java.lang.Class.forName0(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException
方法有:public native boolean java.lang.Class.isAssignableFrom(java.lang.Class)
方法有:public native boolean java.lang.Class.isInstance(java.lang.Object)
方法有:public native int java.lang.Class.getModifiers()
方法有:public native boolean java.lang.Class.isInterface()
方法有:public native boolean java.lang.Class.isArray()
方法有:public native boolean java.lang.Class.isPrimitive()
方法有:public native java.lang.Class java.lang.Class.getSuperclass()
方法有:public native java.lang.Class java.lang.Class.getComponentType()
方法有:private static native void java.lang.Class.registerNatives()
方法有:public java.lang.String java.lang.Class.toString()
方法有:public java.lang.String java.lang.Class.getName()
方法有:static boolean java.lang.Class.access$100(java.lang.Object[],java.lang.Object[])
方法有:static boolean java.lang.Class.access$202(boolean)
方法有:static boolean java.lang.Class.access$302(boolean)
方法有:private static void java.lang.Class.addAll(java.util.Collection,java.lang.reflect.Field[])
方法有:private static java.lang.String java.lang.Class.argumentTypesToString(java.lang.Class[])
方法有:private static boolean java.lang.Class.arrayContentsEq(java.lang.Object[],java.lang.Object[])
方法有:public java.lang.Class java.lang.Class.asSubclass(java.lang.Class)
方法有:public java.lang.Object java.lang.Class.cast(java.lang.Object)
方法有:private static void java.lang.Class.checkInitted()
方法有:private void java.lang.Class.checkMemberAccess(int,java.lang.ClassLoader)
方法有:private void java.lang.Class.clearCachesOnClassRedefinition()
方法有:private static java.lang.re