一:反射属性解析
(一):获取类名《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