Trail: The Reflection API2

方法可能改变自己的行为方式,通过,覆盖,多态,隐藏

而反射机制则让将他跟具体的类结合在一起

 

.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??

 

 

反射与数组和枚举( 略)

 
 

 

你可能感兴趣的:(reflection)