---------------------- JavaEE+Android开发、JavaEE+Android培训、期待与您交流! ----------------------
Java的反射机制
反射(反射就是把java类中的各种成分映射成相应的java类)
1, Class类(反射的基石)
所有类的对象实际上都是Class类的实例。
Class类常用的方法:
Publicstatic Class<?> forName(String className ) 传入完整的“包.类”名称实例化Clas对象
Public Constructor[] getConstructors() 得到一个类中的全部构造方法
实例化Class的方式
类.class
对象.getClass
Class.forName(“包.类”);
注:三种实例化Class对象的方式是一样的,但对前两种来说都需要导入一个明确的类,如果一个类操作不明确,可以使用forName,有很强的灵活性。
2, Class类的使用
2.1无参构造实例化对象
Class c = Class.forName(“包.类”);
Per = c.newinstance();
注:被实例化对象的类中必须存在无参的构造方法。如果不存在,则不可以被实例化。
2.2有参构造实例化对象
步骤:
通过Class类中getConstructorson()取得本类中的全部构造方法。
将取得的构造方法存入一个构造方法类型的对象数组中
使用Constructor实例化对象
Constructor类方法:
Public T newInstance(Object…obj)
向构造方法中传递参数,实例化对象。
3, 通过反射获取一个类的完整结构
Constructor:表示类中的构造方法
构造方法的修饰符,名称,参数类型,信息,实例化对象
Field:表示类中的属性
Methods:表示类中的方法
3.1取得所实现的全部接口
PublicClass[] getInterfaces();
3.2取得父类
PublicClass<?super T> getSuperClass()
3.3取得全部方法
Class类中有Public Method[]getMethods() (得到一个类中的全部方法)这个方法。
返回的是Method类的对象数组,
Method类中的方法:
方法的访问修饰符,名称,全部参数类型,返回值类型,全部抛出的异常
注:IDE中的类方法提示功能就是利用此种方式完成的。
3.4取得类中全部的属性
得到实现的接口或父类中的公共属性:
Public Field[] getFields()
得到本类中的全部属性:
Public Field[] getDeclaredFields()
返回的是Field类的数组
Field类中具有设置和获取属性的方法
4, 反射除了可以取得一个类中的完整结构外,还可以调用类中的指定方法或指定属性,并可以通过反射完成对数组的操作。
4.1通过反射调用类中方法
步骤:
通过Class类中getMethod(Stringname,Class…parameterTypes)方法取得一个Method的对象,并设置此方法操作时所需要的参数类型
使用invoke()进行调用,并向方法中传递要设置的参数
Class c = Class.forName(“包.类”);
Method met = c.getMethod(name,type)
met.invoke(c.newinstance(),type)
若为静态方法则:
Met,invoke(null,type)
访问main方法
StringstartingClassName = args[0];
Method mainMethod =Class.forName(startingClassName).getMethod(“main”,String[].class);
mainMethod.invoke(null,new Bbject[]{newString[]{“111”,”222”,”333”}});
或 mainMethod.invoke(null,(Object)newString[]{“111”,”222”,”333”});
4.2调用setter和getter方法
即Introductor内省中javabean是一种特殊的java类
Class Person
{
Private int x;
Public int getAge(){
Return x;
}
Public void setAge(itn age){
This.x = age;
}
}
Ageà如果第二个字母是小写,则把第一个字母变成小写
gettime--time
setTime--time
getCPU--CPU
4.3通过反射操作属性
第一种:可以通过使用Method调用类中的Setter和getter方法设置和取得属性,
第二种:通过使用Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。
4.4通过反射操作数组(基本类型不是Object)
1,维数相同,类型相同的数组得到的Class相同
维数不同,类型相同的数组得到的Class不同
维数相同,类型不同的数组得到的Class不同
2,代表数组的Class实例对象的getSuperClass()方法返回的是父类的Object类对应的Class。
3,基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,即可当做Object类型使用,又可当做Object[]类型使用。
4,Array.asLIst()方法处理int[]和String[]时的差异。
5,Array工具类
4.5通过反射来模拟框架
InputStream ips = ReflectTest2.class.getResourceAsStream("/cn/itcast/day1/resources/config.properties");
Properties props = new Properties();
props.load(ips);
ips.close();
String className =props.getProperty("className");
Collection collections = (Collection)Class.forName(className).newInstance();
---------------------- JavaEE+Android开发、JavaEE+Android培训、期待与您交流! ----------------------