Java反射解析

一:反射属性解析

(一):获取类名《getSimpleName、getCanonicalName和getName获取类名的区别》

1、getCanonicalName()     是获取所传类从java语言规范定义的格式输出。 
2、getName()             是返回实体类型名称 
3、getSimpleName()         返回从源代码中返回实例的名称

//例子
public class IndexActivity extends BaseActivity {
//状态
State state;
class Inner {}
    @InjectCycle(InjectCycle.CycleType.CONSTRUCTOR)
    void constructor() {
        LogUtil.testInfo("IndexActivity.class--getSimpleName------" + IndexActivity.class.getSimpleName());
        LogUtil.testInfo("IndexActivity.class--getCanonicalName---" + IndexActivity.class.getCanonicalName());
        LogUtil.testInfo("IndexActivity.class--getName------------" + IndexActivity.class.getName());
        LogUtil.testInfo("Inner.class----------getSimpleName------" + IndexActivity.Inner.class.getSimpleName());
        LogUtil.testInfo("Inner.class----------getCanonicalName---" + IndexActivity.Inner.class.getCanonicalName());
        LogUtil.testInfo("Inner.class----------getName------------" + IndexActivity.Inner.class.getName());
    }
}
//打印结果
TEST_LOG: IndexActivity.class--getSimpleName------IndexActivity
TEST_LOG: IndexActivity.class--getCanonicalName---com.hgb.exhibition.ui.index.activity.IndexActivity
TEST_LOG: IndexActivity.class--getName------------com.hgb.exhibition.ui.index.activity.IndexActivity
TEST_LOG: Inner.class----------getSimpleName------Inner
TEST_LOG: Inner.class----------getCanonicalName---com.hgb.exhibition.ui.index.activity.IndexActivity.Inner
TEST_LOG: Inner.class----------getName------------com.hgb.exhibition.ui.index.activity.IndexActivity$Inner

1、除了数组跟匿名类外,getCanonicalName(),
getName()其它都相同(源码注释了还有本地类),而getSimpleName()只是截取前面的包部分,只留下java代码中类名部分。

2、数组中getName()通过[L表示数组,getCanonicalName()通过在定义的类型后面加上[]表示数组,而getSimpleName()只是去掉getCanonicalName()返回结果前面的包部分。因此他们两个很相似,就像父子关系一样,getCanonicalName返回为null,getSimpleName就是空字符串。

3、匿名类中,因为匿名类在java语言规范中是不能呈现出类结构的,它的位置不能通过名称表示出来,所以getCanonicalName()方法返回的是null,同理getSimpleName()方法返回的是代码默认的空字符串,getName()返回通过$后面加上迭代数表示。

(二):有参和无惨构造器《getConstructor和getDeclaredConstructor的区别》

1、getConstructor(Class<?>... parameterTypes)            方法会返回制定参数类型的所有构造器,只返回制定参数类型访问权限是public的构造器。
2、getDeclaredConstructor(Class<?>... parameterTypes)    返回制定参数类型的所有构造器,包括public的和非public的,当然也包括private的构造器。 
3、newInstance()                                            实例化对象

//测试例子
public class ReflexTest {
    private String str;
    private int num;
    private boolean f;
    public ReflexTest() {

    }
    public ReflexTest(String str, int num) {
        this.str = str;
        this.num = num;
    }
    private ReflexTest(String str, int num,boolean f) {
        this.str = str;
        this.num = num;
        this.f = f;
    }
    public ReflexTest(String str) {
        this.str = str;
    }
    public static void main(String[] args) throws Exception {
        //测试反射获取public有参构造器,并实例化对象
        Class[] classes = new Class[] { String.class, int.class };
        ReflexTest reflexTest = ReflexTest.class.getConstructor(classes).newInstance("ReflexTest1", 10);
        System.out.println(reflexTest.str); 
        //测试反射获取public有参构造器,并实例化对象
        ReflexTest reflexTest2 = ReflexTest.class.getDeclaredConstructor(String.class).newInstance("ReflexTest2");
        System.out.println(reflexTest2.str); 
        //测试反射获取private无惨构造器,并实例化对象
        ReflexTest reflexTest3 = ReflexTest.class.getDeclaredConstructor(String.class,int.class,boolean.class).newInstance("ReflexTest3",100,false);
        System.out.println(reflexTest3.str+"====="+reflexTest3.num+"======"+reflexTest3.f); 
        //测试反射获取public无惨构造器,并实例化对象
        ReflexTest reflexTest4 = (ReflexTest) Class.forName("ReflexTest").getConstructor().newInstance(); // 无参也可用getConstructor()
        System.out.println(reflexTest4 instanceof ReflexTest); 
    }
}
//打印结果
TEST_LOG:    hello1
TEST_LOG:    hello2
TEST_LOG:    hello3================100=================false
TEST_LOG:    true

微信公众号,欢迎扫码关注