java反射学习笔记
浑浑噩噩毕业半年多,对于以前学的逻辑的知识也忘记的差不多了,看来是没有希望回去做逻辑了.只能继续自己的码农之路.啥都不懂,但是还是写点东西权当自己的笔记吧.
最近自己在看spring框架,虽然对于spring的了解完全是菜鸟级,但是还是看到了点java的反射的应用.之前对于反射一知半解,决定自己写几个test学习下.
关于原理什么的完全不知道,以后有时间在去深究吧,毕竟对于我这种菜鸟来说先学点来用就可以混下了.那么高深的要积累才能看的吧.
对于一个正在运行的程序,如果能够了解到他其中的类属性以及域属性那是多好美妙的事情.java的反射就是实现这个.
这里主要有3个类:
TaskStarter定时执行任务
打印结果: com.maximilian.www.IntervalTask@12940b3
tmpInt:0 tmpString:0
上面是类的不带参的构造函数,当然也可以调用带参数的不同的构造函数.
如果: IntervalTask的构造函数有public IntervalTask(int argInt,String argString),那么可以通过下面新建实例:
打印结果: com.maximilian.www.IntervalTask@158f9d3
tmpInt:1 tmpString:1
2.获取某个类的静态属性public void getAndInvokeMethod(Object obj,Object [] args,String methodName){Class<?> taskClass = obj.getClass();Method method= null;try {if(args==null){method = taskClass.getDeclaredMethod(methodName);}else{ Class[] argclass = {int.class,String.class}; method = taskClass.getDeclaredMethod(methodName, argclass);} method.setAccessible(true); method.invoke(obj, args); method.setAccessible(false); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); }}
test.getAndInvokeMethod(this, null, "print1")和test.getAndInvokeMethod(this, args, "print5")有参和无参时调用方法。
Java的反射最大的特别是在运行时来做上面的操作。上面的都是一些基本用法,反射提供很多其他好用的方法,如判断某一个对象是否是类的对象的isinstance;一些获取基类的属性和方法(通过继承类的class.getSuperclass()后得到基类的class,后面的操作类似)等。
个人对于object.getclass与Class.Forname(package.classname)区别的理解:
前者是得到内存中的类对象,而后者得到的是内存中的类文件,但是最终得到的都是内存中同一块一样的东西,因为对于个类文件来讲只会在java虚拟机中加载一个类对象。前面的例子中,对于不是静态属性或者方法的是否可调用决定在于具体的对象是否在堆中建立。