方法可能改变自己的行为方式,通过,覆盖,多态,隐藏
而反射机制则让将他跟具体的类结合在一起
.class文件中并不包含方法的形参名称,一方面,很多工具并不希望处理时占据太多的内存
另一方面,像密码等等参数基于安全考虑也不该存储
真的想存储,可以在javac中指定-parameters,这样利用反射将能够得到他们
一般情况获得的参数名称都是arg0这样,除非用了上面的方式
在JDK8以后,有了一个Parameter类
对于内部类,也会有个默认构造,并会自动添加一个参数,指明他的外部类是谁
这个参数叫this$0
public class MethodParameterExamples { public class InnerClass { final MethodParameterExamples parent;//还会添加个字段 InnerClass(final MethodParameterExamples this$0) { parent = this$0; } } }
有个方法,
Is implicit?: true//表示这个参数是默认添加的
有一种构造方法,不是显式定义的(explicitly),也不是默认添加的(implicitly),而是synthetic的,复合的
不同的JVM实现可能添加不同的这种构造,Construct类有个判别方法
Is synthetic?: false
bridge方法(略)
反射机制可以调用某个方法,通常是这个对象无法转换为另一种类型时
Method.invoke(),第一个参数是方法被调用的那个对象,剩下的则是参数
private方法,或者private类的public方法,在invoke()之前,需要获取权限,setAccessible(true)
另外调用时传递new Object[0]跟不传递一样,因为这只是个空数组
不过方法本来就无参的话也是会报错
InvocationTargetException包装了调用时的所有异常,可用来捕获
Constructor.newInstance()可以有参数,从而调用各个构造方法
任何异常都会抛出,不管是不是checked
new 跟Constructor.newInstance()的区别在于:new会检查参数的类型,会自动装箱拆箱and method resolution??
反射与数组和枚举( 略)